Cmake 如何在没有完整路径的情况下链接静态库?

Cmake 如何在没有完整路径的情况下链接静态库?,cmake,Cmake,CMakeLists.txt: root +-- main.cpp +-- CMakeLists.txt +-- liblib1.a 如何在没有${CMAKE\u SOURCE\u DIR}的情况下链接,如: cmake_minimum_required(VERSION 3.5) project(testlib LANGUAGES CXX) set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED ON) add_exec

CMakeLists.txt:

root
 +-- main.cpp
 +-- CMakeLists.txt
 +-- liblib1.a
如何在没有
${CMAKE\u SOURCE\u DIR}
的情况下链接,如:

cmake_minimum_required(VERSION 3.5)

project(testlib LANGUAGES CXX)

set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

add_executable(testlib main.cpp)

target_link_libraries(testlib
    ${CMAKE_SOURCE_DIR}/liblib1.a
)
如何使
${CMAKE\u SOURCE\u DIR}
路径对CMAKE
ld
可见


顺便说一句,下面的代码无效错误:找不到-llib1

target_link_libraries(testlib
    lib1
)
使用:

指定链接器在链接给定目标时搜索库的路径

注意:此命令很少是必需的,应该避免在有 其他选择。更愿意将完全绝对路径传递到 这是可能的,因为这样可以确保始终使用正确的库 链接

使用:

指定链接器在链接给定目标时搜索库的路径

注意:此命令很少是必需的,应该避免在有 其他选择。更愿意将完全绝对路径传递到 这是可能的,因为这样可以确保始终使用正确的库 链接


在CMake中指定库的目录是
link\u目录

我没有得到工作,因为
链接\u目录
必须放在
添加可执行文件
的前面

像这样:

target_link_directories(testlib PUBLIC ${CMAKE_SOURCE_DIR})

顺便说一句,我发现了一个关于这种CMake依赖用法的很好的教程。

在CMake中指定库的目录是
link\u目录

我没有得到工作,因为
链接\u目录
必须放在
添加可执行文件
的前面

像这样:

target_link_directories(testlib PUBLIC ${CMAKE_SOURCE_DIR})

顺便说一句,我发现了一个关于这种CMake依赖用法的很好的教程。

您可以将库复制到系统库路径中。@squareskittles可以添加
${CMAKE_SOURCE_DIR}
使其与系统库路径相同?您可以将库复制到系统库路径中。@squareskittles可以添加
${CMAKE_SOURCE_DIR}
使其与系统库路径相同?这确实有效…但我只想使特定路径对
ld
可见,我不明白您的意思。这如何使路径对链接器不可见?您只想将路径添加到
/etc/ld.so.conf
?使用LD_PRELOAD?
target_link_目录(testlib PUBLIC${CMAKE_SOURCE_DIR})
将自动找到lib,但我只希望链接器可以看到
${CMAKE_SOURCE_DIR}
,然后我手动指定链接库,而不是自动指定。这确实有效……但我只是想让
ld
可以看到特定的路径,我不明白您的意思。这如何使路径对链接器不可见?您只想将路径添加到
/etc/ld.so.conf
?使用LD_PRELOAD?
target_link_directories(testlib PUBLIC${CMAKE_SOURCE_DIR})
将自动找到libs,但我只希望链接器可以看到
${CMAKE_SOURCE_DIR}
,然后我手动而不是自动指定链接libs。不建议使用该命令,它甚至在文档中说。您应该更喜欢KamilCuk回答中使用的基于目标的命令。@squareskittles是的,我理解,我实际上使用了带有特定路径的库,这个问题只是出于好奇。谢谢你提醒我。不建议使用这个命令,它甚至在文档中说。您应该更喜欢KamilCuk回答中使用的基于目标的命令。@squareskittles是的,我理解,我实际上使用了带有特定路径的库,这个问题只是出于好奇。谢谢你提醒我。
link_directories(${CMAKE_SOURCE_DIR})

add_executable(testlib main.cpp)

target_link_libraries(testlib
    lib1
)