Cmake 如何正确地将路径添加到libfiles?

Cmake 如何正确地将路径添加到libfiles?,cmake,Cmake,我的项目在~/SimGrid/lib目录中有一个依赖项库。 如何将其正确添加到我的CMakeLists.txt 现在我尝试链接目录(/home/whoami/SimGrid/lib),但它没有帮助,并提供: [ 5%] Linking CXX executable CSim2Sim /usr/bin/ld: cannot find -lsimgrid collect2: error: ld returned 1 exit status 我的完整CMakeLists.txt如下: projec

我的项目在
~/SimGrid/lib
目录中有一个依赖项库。 如何将其正确添加到我的
CMakeLists.txt

现在我尝试
链接目录(/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)

link\u目录
只告诉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
add
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})

在Linux上,链接器希望库文件名的前缀为“lib”:

如果库文件没有此类前缀,则链接器无法使用普通库名称找到它

与此相反,在
target\u link\u libraries
调用中指定完整库文件名始终有效:

# Assume filename of the library is 'simgrid.so'
target_link_libraries(CSim2Sim /home/whoami/SimGrid/lib/simgrid.so)

在这种情况下,不需要调用
link\u directories()

我的建议是找到项目所依赖的库并将其链接到目标。因此,任何绝对路径或相对路径都不在cmake文件中,而是在运行cmake时检测到的


请参见

我已将您的建议添加到
CMakeLists.txt
,但我有相同的错误。可能是因为我有
。因此
文件,而不是
。a
文件?@CinderBiscuits:使用相对路径(如
simgrid.a
)到库是未定义的行为。相反,原始core使用简单的库名(
simgrid
),它具有定义良好的行为。除了其他错误(您的
SimGrid.cmake
misses
include\u目录
call)之外,您的方法还有一点意义。如果您建议使用附加脚本进行库检测,则它应该是
FindSimGrid.cmake
脚本,包含在
find\u包(SimGrid)
中。请参阅
# Assume filename of the library is 'simgrid.so'
target_link_libraries(CSim2Sim /home/whoami/SimGrid/lib/simgrid.so)