【问题标题】:CMake omit libraries passed to 'target_link_libraries'CMake省略传递给'target_link_libraries'的库
【发布时间】:2017-05-04 18:38:47
【问题描述】:

我有一组自定义库,我正在尝试使用我编写的 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

我也听说你可以使用target_link_libraries(),所以我在所有的`src/*/CMakeLists.txt中添加了类似的行:

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 编译一个这样的二进制文件并得到以下输出(为简洁起见,仅相关行):

Linking C executable pi-d
cd /home/user/projectname/build/src/pi_d && /usr/bin/cmake -E cmake_link_script CMakeFiles/pi-d.dir/link.txt --verbose=1
/usr/bin/cc  --std=gnu99     CMakeFiles/pi-d.dir/PId.c.o  -o pi-d  -L/home/user/projectname/lib -rdynamic ../../lib/libcomm.so ../../lib/libdaemon.so ../../lib/libsock.so -Wl,-rpath,/home/user/projectname/build/lib:/home/user/projectname/lib 

看起来它只得到libcommlibdaemonlibsock,而忽略了libdebuglibtty。为什么会这样?我可以改变什么?

【问题讨论】:

    标签: makefile cmake linker linker-errors


    【解决方案1】:

    debugtarget_link_libraries 命令的关键字

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

    【讨论】:

    【解决方案2】:

    我通过简单地将目标重命名为 debug_lib 来解决此问题。

    add_library(debug_lib SHARED ${DEBUG_LIB_SRC})
    

    这会导致库被称为libdebug_lib.so,但这对我来说没问题。

    【讨论】:

      猜你喜欢
      • 2020-03-30
      • 1970-01-01
      • 2012-01-26
      • 2016-12-05
      • 1970-01-01
      • 2011-07-20
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多