Cygwin下用CMake编译库
Posted
技术标签:
【中文标题】Cygwin下用CMake编译库【英文标题】:Compiling libraries with CMake under Cygwin 【发布时间】:2010-09-21 18:18:25 【问题描述】:我一直在尝试使用 CMake 作为一种迷你项目来编译 TinyXML,并尝试学习 CMake。另外,我正在尝试将其编译为动态库并自行安装以使其正常工作。
到目前为止,我已经设法让它编译和安装,但它编译成一个 .dll 和一个 .dll.a,让它工作的唯一方法是将它安装到 /bin 和 /lib 中,这使得它将两个文件都安装在两个文件夹中。此设置有效,但我猜 .dll 应该在 /bin 中,而 .dll.a 应该在 /lib 中。这是某种 Cygwin 特有的问题还是我做错了什么?
【问题讨论】:
发布您的CMakeLists.txt
,让人们有机会猜到问题。
我很想有人回答如何使它成为一个静态库。 *.lib 我认为?
【参考方案1】:
.dll 是运行时库文件,它必须在运行时出现在目标系统上(并且在 $PATH 中)。 .dll.a 文件是 .dll 的导入库,它必须在链接时出现在编译机器上。您需要将 .dll 文件分发到程序应该运行的地方,并将 .dll 和 .dll.a 分发到使用该库链接其他程序的地方。您不需要仅在运行该程序的机器上的 .dll.a 文件。
当您不想创建共享库时,可以在 add_library 命令中使用 static keyword 告诉 cmake:
add_library(mylib STATIC foo.c bar.cpp)
这种方式不会创建共享库,但链接器会将库中的代码添加到最终的可执行文件中。
【讨论】:
你真的需要lib/中的DLL吗? DLL 平台上的约定是可执行文件(DLL 被认为是)应该放在 PATH (= /bin) 中。剩下的 dll.a 应该在 /lib 中。我还没有看到 Cmake 开箱即用地理解这一点。有人吗? @ThomasNilsson 我的意思是在库链接到其他程序的机器上需要 .dll.a 文件。它不需要将它们安装在 bin/ 中,它只需要注意导入库在链接时位于链接器搜索路径中。【参考方案2】:您需要为每种类型的文件指定一个目的地。
.dll 被认为是一个 RUNTIME 库,而 .a 是一个 ARCHIVE。以防万一,对于其他平台,您可能需要 LIBRARY 条目(用于 .so 文件)。
install( TARGETS $PROJECT_NAME
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib
RUNTIME DESTINATION bin
)
【讨论】:
以上是关于Cygwin下用CMake编译库的主要内容,如果未能解决你的问题,请参考以下文章