我的项目在~/SimGrid/lib
目录中有一个依赖库。
如何正确将其添加到CMakeLists.txt
?
现在我尝试link_directories(/home/whoami/SimGrid/lib)
,但它没有帮助并给出:
[ 5%] Linking CXX executable CSim2Sim
/usr/bin/ld: cannot find -lsimgrid
collect2: error: ld returned 1 exit status
我的完整CMakeLists.txt
就在这里:
project(CSim2Sim)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -O0")
set(SOURCE_FILES src/main.cpp)
add_executable(CSim2Sim ${SOURCE_FILES})
include_directories(/home/whoami/SimGrid/include)
link_directories(/home/whoami/SimGrid/lib)
target_link_libraries(CSim2Sim simgrid)
答案 0 :(得分:1)
link_directories
只告诉CMake要查找要链接到的库的内部目录,而不是要链接的库。我的建议是创建一个名为SimGrid.cmake
的文件并添加以下内容:
# -*- cmake -*-
set(SIMGRID_INCLUDE_DIRS
${CMAKE_SOURCE_DIR}/SimGrid/include
)
set(SIMGRID_LIBRARIES
simgrid.a
simgrid2.a # etc for the names of the actual libs you want to link
)
在CMakeLists.txt
添加include(SimGrid)
以便将新文件拉入。
然后在CmakeLists.txt
中使用新变量和target_link_libraries
,这是您用来告诉链接器要链接的库的函数:
include_directories(${SIMGRID_INCLUDE_DIRS})
target_link_libraries(CSim2Sim ${SIMGRID_LIBRARIES})
当然,您可以将它全部添加到单个CMakeLists.txt
中,但将其分开是保持可管理性的好方法。
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -g -O0")
set(SOURCE_FILES src/main.cpp)
add_executable(CSim2Sim ${SOURCE_FILES})
link_directories(${CMAKE_SOURCE_DIR}/SimGrid/lib)
include_directories(${CMAKE_SOURCE_DIR}/SimGrid/include)
set(SIMGRID_LIBRARIES
simgrid.a
simgrid2.a
)
target_link_libraries(CSim2Sim ${SIMGRID_LIBRARIES})
答案 1 :(得分:1)
在Linux上,链接器期望库文件名以“lib”为前缀:
/home/whoami/SimGrid/lib/libsimgrid.so
如果您的库文件没有这样的前缀,链接器使用普通库名称找不到它。
相反,在target_link_libraries
通话中指定完整库文件名始终有效:
# Assume filename of the library is 'simgrid.so'
target_link_libraries(CSim2Sim /home/whoami/SimGrid/lib/simgrid.so)
在这种情况下,不需要link_directories()
来电。
答案 2 :(得分:0)
我的建议是找到项目所依赖的库并将其链接到目标。因此,任何absolut或相对路径都不在cmake文件中,但在运行cmake时检测到。