2017-05-04 71 views
0

我有一组自定义库,我正尝试使用我编写的CMake文件进行构建。当前目录结构如下:使用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 

这看起来像是只得到libcommlibdaemon,并且libsock,忽视libdebuglibtty。为什么会这样?我可以改变什么?

回答

0

我解决了这个问题,只需将目标重命名为debug_lib即可。

add_library(debug_lib SHARED ${DEBUG_LIB_SRC}) 

这使得制造被称为libdebug_lib.so库,但是这很好,我的目的。

0

debug关键字对于target_link_libraries命令。

与库的链接后面的关键字只执行“调试”配置,这可能不是你的情况。

+0

我试图实现你在这里给出的答案:http://stackoverflow.com/questions/39662985/linking-against-a-library-called-debug-in-cmake和运行到“找不到-ldebug_lib“,这似乎是在翻译中迷失的东西。 – ijustlovemath