The*_*nia 14 c++ python dll cmake visual-studio-2010
几年前,我背负着建立和修改位于NorthEast(也许是"Down East")的合作伙伴工程机构的庞大包裹的困扰.这个包是用一种叫"cmake的"使用Linux作为目标...... cmake的建立,恕我直言,最令人惊讶的郁闷,记录不完整,结构奇特的构建系统我曾经有给我的能力有限,工作的不满(28岁*NIX系统的专业经验和构建开源代码).
然后我不得不用"cmake"建立另一个针对MSVS的项目.哦,快乐!最后SOMETHING可以可靠地生成那些讨厌的"项目"和"解决方案"文件.那些相同的CMakeLists.txt文件可以重新定位Linux!哇,我已经看到了光明.
不过,我现在仍然很黑.除非我开始使用CMakeLists.txt文件,否则我似乎无法从头开始,并在该过程中花费不到一天的时间来解决最简单的问题.
我有一个任务是使用MSVS构建一个DLL,可以使用ctypes从Python脚本访问它.基本上,这意味着一个在板上有符号的DLL.由于我有一个10年前的错误,我的VS 2008和VS 2010的安装无法创建一个新的C++项目,我想我会选择用cmake生成DLL解决方案.
我还没有找到一个现代的(又名post cmake 2.8.5)完整的用cmake构建DLL的例子,这个任务应该比过去好得多.
潜入教程http://www.cmake.org/cmake/help/cmake_tutorial.html这很糟糕,因为他们希望你在学习cmake的同时编写C++代码.(嘿,伙计!我有足够的麻烦让cmake工作,让make代码将编译!)本教程虽然构建一个简单的二进制文件,然后使用库创建一个二进制文件,但它不会生成DLL.
在行之间阅读http://www.cmake.org/Wiki/BuildingWinDLL,我天真地将一些代码添加到lib目录中的CMakeLists.txt文件中:
之前:
add_library(MathFunctions mysqrt.cxx)
install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)
Run Code Online (Sandbox Code Playgroud)
后:
add_library(MathFunctions SHARED mysqrt.cxx)
GENERATE_EXPORT_HEADER( MathFunctions
BASE_NAME MathFunctions
EXPORT_MACRO_NAME MathFunctions_EXPORT
EXPORT_FILE_NAME MathFunctions_Export.h
STATIC_DEFINE MathFunctions_BUILT_AS_STATIC
)
install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)
Run Code Online (Sandbox Code Playgroud)
cmake 3.0.0和cmake 2.8.12.2这两个文件的winge:
CMake Error at MathFunctions/CMakeLists.txt:2 (GENERATE_EXPORT_HEADER):
Unknown CMake command "GENERATE_EXPORT_HEADER".
Run Code Online (Sandbox Code Playgroud)
该函数似乎在cmake安装中作为GenerateExportHeader.cmake,并且没有任何调试显示此错误的"原因".我无法在互联网上找到此错误.
那是我一天中的前六个小时.
我终于决定删除有问题的命令并试试这个:
add_library(MathFunctions mysqrt.cxx)
install (TARGETS MathFunctions DESTINATION bin)
install (FILES MathFunctions.h DESTINATION include)
Run Code Online (Sandbox Code Playgroud)
WA-LA!cmake已配置并生成,MSVS已成功构建,并且DLL出现在库目录的Debug子目录中.Kuel.
但是,此DLL不包含允许python/ctypes访问所需函数的符号.在BuildingWinDLL页面中进行了一些工作之后,我设法引出符号.Python非常高兴,我现在有一个未来工作的模型,即使它是一个粗鲁,简单的黑客!
在那个冗长的讨论之后:
PS:非常,漂亮,友好的文章组合系统在stackoverflow.我会喜欢这个,假设我被允许回来......
在steveire回答之后更新:
最初的问题回答了,我看到我错过了BuildingWinDLL页面中的提示.我还发现我没有为自己的代码更改示例中的一个字段.
所以现在我们进入下一层.使用引用的示例,VS2010解决方案构建抱怨:
LINK : fatal error LNK1104: cannot open file 'MathFunctions\Debug\MathFunctions.lib'
Run Code Online (Sandbox Code Playgroud)
我从BuildingWinDLL收集到,GENERATE_EXPORT_HEADER()在构建DLL时全部都在跳舞.未生成.lib文件,生成的.dll不包含符号...
BuildingWinDLL页面讨论了pre-cmake-2.8.5进程.页面顶部提到的2.8.5过程是如何使用GENERATE_EXPORT_HEADER()自动生成页面底部的文件.仍然需要将这些碎片编织在一起,这在文中并不清楚.
所以MathFunctions_Export.h由GENERATE_EXPORT_HEADER()cmake的命令生成和这里提出并创建用于使符号要导出的宏C头的特定参数.显然必须明确引用此文件,并且要正确限定导出的符号:
#include <math.h>
#include <Mathfunctions/MathFunctions_Export.h>
MathFunctions_EXPORT double mysqrt(double v) {
return sqrt(v);
}
Run Code Online (Sandbox Code Playgroud)
现在添加#include和*EXPORT限定符会导致符号被导出,VS现在知道生成.lib并用符号填充.dll.
成功!感谢所有帮助过这个过程的人,并在我的痛苦中遭受了我的痛苦.
include(GenerateExportHeader)
Run Code Online (Sandbox Code Playgroud)
在使用它之前.
http://www.cmake.org/cmake/help/v3.0/module/GenerateExportHeader.html
CMake默认构建STATIC库,因此如果要构建共享库,请保留SHARED.
归档时间: |
|
查看次数: |
12439 次 |
最近记录: |