针对CMake中没有完整路径的静态系统库进行链接
在为公共系统库构建CMake find模块时,针对CMake中没有完整路径的静态系统库进行链接,cmake,static-linking,Cmake,Static Linking,在为公共系统库构建CMake find模块时,libatomic,我注意到,如果使用静态库(即libatomic.a)的名称创建一个STATIC IMPORTED目标,然后将其添加到非导入目标(例如foo)的链接库中这种行为并不像预期的那样。例如: add_library(Atomic::atomic STATIC IMPORTED) set_target_properties(Atomic::atomic PROPERTIES IMPORTED_LOCATION "li
libatomic
,我注意到,如果使用静态库(即libatomic.a
)的名称创建一个STATIC IMPORTED
目标,然后将其添加到非导入目标(例如foo
)的链接库中这种行为并不像预期的那样。例如:
add_library(Atomic::atomic STATIC IMPORTED)
set_target_properties(Atomic::atomic
PROPERTIES
IMPORTED_LOCATION "libatomic.a"
)
add_executable(foo)
target_link_libraries(foo
PRIVATE
Atomic::atomic
)
我所期望的行为是在Linux上的链接行中添加如下内容:
-Wl,-Bstatic -latomic -Wl,-Bdynamic
或:
但是,当使用Unix Makefiles
生成器时,我实际看到的是libatomic.a
作为foo
的依赖项添加到Makefile中。此外,只需将libatomic.a
添加到链接行,而不是所需的表单之一。是否有一种方法可以实现我的目标,而无需找到目标库的完整路径,例如libatomic.a
这样做的基本原理是找到libatomic.a
的路径并不容易,因为它可能位于某些编译器特定的位置(例如devtoolset位置)“这样做的基本原理是,找到libatomic.a
的路径并不容易,因为它可能位于编译器特定的位置(例如devtoolset位置)。“-工具链负责告知CMake系统库的位置。因此,find_library
应该可以工作。@Tsyvarev这似乎实际上不起作用-例如,如果我尝试find_library(原子库名称libatomic.a)
它将找不到库,尽管它使用了devtoolset中安装了libatomic.a
的GCC。还有什么我应该做的吗?可能,您的工具链不太正确,因为它没有提供编译器包含的路径。“其基本原理是,找到libatomic.a
的路径有点不简单,因为它可能位于编译器特定的位置(例如在devtoolset位置)。”-工具链负责告知CMake系统库的位置。因此,find_library
应该可以工作。@Tsyvarev这似乎实际上不起作用-例如,如果我尝试find_library(原子库名称libatomic.a)
它将找不到库,尽管它使用了devtoolset中安装了libatomic.a
的GCC。还有什么我应该做的吗?也许,您的工具链不太正确,因为它没有提供编译器包含的路径。
-l:libatomic.a