CMake 省略传递给 'target_link_libraries' 的库
CMake omit libraries passed to 'target_link_libraries'
我有一组自定义库,我正在尝试使用我编写的 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
看起来它只得到 libcomm
、libdaemon
和 libsock
,忽略了 libdebug
和 libtty
。为什么会这样?我可以改变什么?
debug
是 target_link_libraries 命令的 关键字 。
仅针对 "Debug" 配置执行该关键字后的库链接,这可能不是您的情况。
我通过简单地将目标重命名为 debug_lib
来解决这个问题。
add_library(debug_lib SHARED ${DEBUG_LIB_SRC})
这导致库被称为 libdebug_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
我也听说你可以使用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
看起来它只得到 libcomm
、libdaemon
和 libsock
,忽略了 libdebug
和 libtty
。为什么会这样?我可以改变什么?
debug
是 target_link_libraries 命令的 关键字 。
仅针对 "Debug" 配置执行该关键字后的库链接,这可能不是您的情况。
我通过简单地将目标重命名为 debug_lib
来解决这个问题。
add_library(debug_lib SHARED ${DEBUG_LIB_SRC})
这导致库被称为 libdebug_lib.so
,但这对我的目的来说没问题。