我想创建更具体命名的CMakeLists.txt文件,如"CMakeLists_nightly.txt","CMakeLists_weekly.txt"等等.我想这样做的原因是减少我的项目的文件夹层次结构混乱.我可以轻松地将每个文件放在他们自己的文件夹中,并使用上面显示的后缀,但我不想这样做.
我可以告诉cmake用另一个名字取一个CMakeLists.txt文件吗?我之前在另一个论坛上看到过这个问题(http://www.cmake.org/pipermail/cmake/2007-August/016036.html)但是它回到了2007年,答案是否定的.当前版本的CMake是否提供此功能?
问题:我正在CMake中构建一个外部项目.该项目有一个Makefile,最终生成一个共享对象.我想链接并在我的超级项目中安装此对象,就像它是项目中的一个库一样.问题是ExternalProject lib是通过相对路径链接到我的应用程序和库,而不是从CMake放置的任何目录运行时导致问题的绝对路径.
我已经创建了一个示例SSCCE示例项目来演示我的整体设置.如果需要,请随意阅读和编译(git clone https://github.com/calebwherry/cmake-SO-question-main --recursive && cd cmake-SO-question-main && mkdir build && cd build && cmake .. && make && cd src/app/testApp && ldd testApp).
每当我运行ldd可执行文件和库时,我得到如下输出:
linux-vdso.so.1 => (0x00007fff8b5a2000)
libTestLib.so => /home/jwherry3/repos/cmake-superprj-main-test/build/src/lib/TestLib/libTestLib.so (0x00007f592da57000)
../../lib/libExtLib.so (0x00007f592d855000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f592d539000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f592d2b7000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f592d0a0000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f592cd14000)
/lib64/ld-linux-x86-64.so.2 (0x00007f592dc5a000)
Run Code Online (Sandbox Code Playgroud)
我已经尝试过处理RPATHS的各种事情,但无法将ExtLib连接到正确的位置.项目本地的lib(libTestLib.so)链接就好了.
我还试图LD_LIBRARY_PATH在运行应用程序时设置覆盖相对路径,但即使我这样做,它仍然找不到库.我想因为它是相对的,它不遵循正常的链接顺序?结果是二进制文件不会运行,除非我在它所在的目录中.
我觉得在使用ExternalProject创建依赖项时,我正在做一些非常愚蠢的事情,这是我的问题,但是我已经打了3天,并没有想出任何东西.
系统设置:Debian Wheezy 64位,CMake 3.0.2,g ++ - 4.9.2.
建立
在尝试在本地C++库的C++/CLI包装器中的翻译单元范围创建静态对象时,我遇到了使用auto关键字的问题.C++/CLI包装器纯粹是功能性的,因此我需要使用ConcurrentDictionary在调用之间保持一些状态(以处理Managed < - > Native委托转换).我第一次尝试这个(简化):
static ConcurrentDictionary<String^, String^>^ GlobalData1 = gcnew ConcurrentDictionary<String^, String^>();
Run Code Online (Sandbox Code Playgroud)
但这无法编译:
具有静态存储持续时间的变量不能具有句柄或跟踪引用类型
为简单起见,我决定继续使用类型推导,同时我发现了问题:
static auto GlobalData3 = gcnew ConcurrentDictionary<String^, String^>();
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是这个编译和链接!我继续编写了一段时间的代码,然后运行了使用C++/CLI包装器的C#测试应用程序并收到了未处理的运行时异常:
未处理的异常:System.IO.FileLoadException:无法加载文件或程序集'DotNetTestLibWrapper,Version = 1.0.6111.33189,Culture = neutral,PublicKeyToken = null'或其依赖项之一.无法找到或加载类型.(来自HRESULT的异常:0x80131522)---> System.TypeLoadException:从程序集'DotNetTestLibWrapper中输入'',Version = 1.0.6111.33189,Culture = neutral,PublicKeyToken = null'具有非法类型的字段.
自从我做了其他编辑后,我没有立即知道问题是什么.我终于通过打开Fusion日志和使用Fuslogvw.exe获得了更多信息.问题在于推断类型的静态ConcurrentDictionary.
我创建了一个SSCCE来演示这个问题:https://github.com/calebwherry/DotNetWrapperForNativeCppLibrary
这篇文章中描述的代码位于:https://github.com/calebwherry/DotNetWrapperForNativeCppLibrary/blob/master/DotNetTestLibWrapper/DotNetTestLibWrapper.cpp
MSVS版本:
Microsoft Visual Studio社区2015版本14.0.25431.01更新3 Microsoft .NET Framework版本4.6.01038
题
这些都会导致编译错误:
static ConcurrentDictionary<String^, String^>^ GlobalData1 = gcnew ConcurrentDictionary<String^, String^>();
static auto^ GlobalData2 = gcnew ConcurrentDictionary<String^, String^>();
Run Code Online (Sandbox Code Playgroud)
但是这会编译+链接,但会导致关于非法类型的未处理的运行时异常:
static auto GlobalData3 = gcnew …Run Code Online (Sandbox Code Playgroud)