Makefile CMake忽略传递给';目标链接库';

Makefile CMake忽略传递给';目标链接库';,makefile,cmake,linker,linker-errors,Makefile,Cmake,Linker,Linker Errors,我有一组自定义库,我正在尝试使用我编写的CMake文件构建它们。当前目录结构如下所示: ├── lib ├── src │   ├── ac_d │   ├── at_d │   ├── bp_d │   ├── fm_d │   ├── hm_d │   ├── pi_d │   ├── pv_d │   ├── ra_d │   └── rc_d └── test 我的目标是让编译器在链接/src目录中的可执行文件时使用/lib目录中构建的.so文件。我尝试了以下方法,但没有效果: 在顶级

我有一组自定义库,我正在尝试使用我编写的CMake文件构建它们。当前目录结构如下所示:

├── lib
├── src
│   ├── ac_d
│   ├── at_d
│   ├── bp_d
│   ├── fm_d
│   ├── hm_d
│   ├── pi_d
│   ├── pv_d
│   ├── ra_d
│   └── rc_d
└── test
我的目标是让编译器在链接
/src
目录中的可执行文件时使用
/lib
目录中构建的.so文件。我尝试了以下方法,但没有效果:

在顶级CMakeLists.txt中:

/* minimum version, project name etc */

set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/lib)
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/lib)

/* other stuff */
set(CDH_LIB_NAMES comm daemon debug tty sock)

set(CDH_LIB_INCLUDES
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/global.h
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libcomm.h
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libdaemon.h
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libdebug.h
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libtty.h
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libsock.h
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/uthash.h
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/utlist.h)

add_subdirectory(lib) # make sure we build .so first
include_directories(lib) # then use this as an include directory
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib) # and a link directory
find_library(CDH_LIBS
    NAMES tty comm sock debug daemon
    PATHS "${CMAKE_CURRENT_SOURCE_DIR}/lib"
) # Not sure if this does anything
add_subdirectory(src) # Now build the src binaries
set(ACD_BIN ACdtest)
set(ACD_SRC
        ${CMAKE_CURRENT_SOURCE_DIR}/ACd.c
        ${CMAKE_CURRENT_SOURCE_DIR}/ACd.h
        ${CDH_LIB_INCLUDES})
add_executable(${ACD_BIN} ${ACD_SRC})
target_link_libraries(${ACD_BIN} ${CDH_LIB_NAMES})
我还听说您可以使用
target\u link\u libraries()
,因此我在所有`src/*/CMakeLists.txt中添加了类似的行:

/* minimum version, project name etc */

set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/lib)
set(CMAKE_LIBRARY_PATH ${CMAKE_LIBRARY_PATH} ${CMAKE_CURRENT_SOURCE_DIR}/lib)

/* other stuff */
set(CDH_LIB_NAMES comm daemon debug tty sock)

set(CDH_LIB_INCLUDES
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/global.h
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libcomm.h
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libdaemon.h
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libdebug.h
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libtty.h
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/libsock.h
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/uthash.h
        ${CMAKE_CURRENT_SOURCE_DIR}/lib/utlist.h)

add_subdirectory(lib) # make sure we build .so first
include_directories(lib) # then use this as an include directory
link_directories(${CMAKE_CURRENT_SOURCE_DIR}/lib) # and a link directory
find_library(CDH_LIBS
    NAMES tty comm sock debug daemon
    PATHS "${CMAKE_CURRENT_SOURCE_DIR}/lib"
) # Not sure if this does anything
add_subdirectory(src) # Now build the src binaries
set(ACD_BIN ACdtest)
set(ACD_SRC
        ${CMAKE_CURRENT_SOURCE_DIR}/ACd.c
        ${CMAKE_CURRENT_SOURCE_DIR}/ACd.h
        ${CDH_LIB_INCLUDES})
add_executable(${ACD_BIN} ${ACD_SRC})
target_link_libraries(${ACD_BIN} ${CDH_LIB_NAMES})
由于某种原因,我仍然得到未定义的引用。因此,我尝试用
make VERBOSE=1 pi-d
编译一个这样的二进制文件,并得到以下输出(为了简洁起见,仅相关行):


看起来它只得到了
libcomm
libdaemon
libsock
,忽略了
libdebug
libtty
。为什么会这样?我可以更改什么?

debug
是命令的关键字


与该关键字后面的库的链接仅针对“Debug”配置执行,这可能不是您的情况。

Debug
是命令的关键字


该关键字后面的库链接仅针对“Debug”配置执行,这可能不是您的情况。

我通过简单地将目标重命名为
Debug_lib
解决了这个问题

add_library(debug_lib SHARED ${DEBUG_LIB_SRC})

这导致生成的库被称为
libdebug\u lib.so
,但这对我来说没什么问题。

我只需将目标重命名为
debug\u lib
,就解决了这个问题

add_library(debug_lib SHARED ${DEBUG_LIB_SRC})

这导致生成的库被称为
libdebug\u lib.so
,但这对我来说没关系。

我正在尝试实现您在这里给出的答案:并遇到了“找不到-ldebug\u lib”的问题,我正在尝试实现你在这里给出的答案:并遇到了“找不到-ldebug_lib”的问题,这似乎是在翻译中丢失了一些东西。