如何正确添加libfiles的路径?

时间:2017-01-14 15:27:17

标签: cmake

我的项目在~/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)

3 个答案:

答案 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时检测到。

请参阅How can I find a library name of .so file?