Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cmake 为什么在使用MingW32而不是在Linux下交叉编译时会出现链接错误_Cmake - Fatal编程技术网

Cmake 为什么在使用MingW32而不是在Linux下交叉编译时会出现链接错误

Cmake 为什么在使用MingW32而不是在Linux下交叉编译时会出现链接错误,cmake,Cmake,我有一个使用cmake定义的共享库。库的一部分调用库用户需要实现的函数 当我在Linux上编译它时,一切正常。当我在Cygwin下使用MingW交叉编译它时,我会在上面描述的那些函数以及依赖库中的任何函数上得到链接错误 My CMakeLists.txt指定库的“添加库”和“目标包含目录”关键字,例如: add_library(my_library SHARED my_lib_1.c my_lib_2.c) target_include_directories(my_library PUBLIC

我有一个使用cmake定义的共享库。库的一部分调用库用户需要实现的函数

当我在Linux上编译它时,一切正常。当我在Cygwin下使用MingW交叉编译它时,我会在上面描述的那些函数以及依赖库中的任何函数上得到链接错误

My CMakeLists.txt指定库的“添加库”和“目标包含目录”关键字,例如:

add_library(my_library SHARED my_lib_1.c my_lib_2.c)
target_include_directories(my_library PUBLIC /usr/local/include PUBLIC ${CMAKE_CURRENT_SOURCE_DIR}/inc)
为什么它在Linux上编译正常,而不是Cygwin/MingW

如何让它在Cygwin/MingW下编译

非常感谢。

说:

正如许多人可能知道的那样,DLL有一个限制:它们不能 甚至一个未定义的符号。这意味着在创建DLL时, 您必须将其与其他DLL链接,以获取所有未定义的DLL 以某种方式解析对象文件中的符号

…对于DLL,这不太好,因为它不能有未定义的符号和 默认情况下,DLL不会链接回您的应用程序(EXE)

或者换一种说法,“Windows不够完善,设计不好,而且通常都是垃圾,因此完全无法完成尼克斯在没有任何明显努力的情况下所做的一半事情”

回答我自己的上述问题:

1) 共享库编译可以在Linux上运行,因为Linux可以容忍未定义的符号。如果Linux/GCC在链接时不需要符号(因为它正在创建一个共享库),或者实际上没有链接(您需要链接来创建一个DLL,但不需要创建一个共享库),那么它就不需要符号。由于Windows的设计和体系结构不好,因此在创建DLL时需要链接所有符号,而不是在最终链接时(即链接可执行文件时)满足所有符号,因此共享库编译失败

2a)解决方案是在cmake中检测MingW编译,并为共享库用户生成导入库,并将共享库链接到该库以及所有其他依赖项。缺点是,如果我想将库作为独立实体分发,这将需要大量文档

2b)第二个解决方案是重新构建我的共享库以解决此问题。就我个人而言,我讨厌破坏我现有的整洁和纤细的线条设计来解决操作系统的不足之处。我讨厌操作系统的法西斯暴利,也讨厌它的无能