我正在尝试使用CMake脚本在Windows上编译基于Boost的应用程序.仅头文件库工作正常,但CMake无法找到库(无法找到以下Boost库:) boost_serialization.CMake脚本的相关部分是:
# Path where CMake can find additional libraries
SET(CMAKE_PREFIX_PATH Libs)
# Boost
SET(Boost_ADDITIONAL_VERSIONS "1.47" "1.47.0")
SET(Boost_USE_STATIC_LIBS ON)
find_package(Boost REQUIRED COMPONENTS serialization)
Run Code Online (Sandbox Code Playgroud)
我的项目中有一个名为"Libs"的文件夹,其中存储了第三方库,如DevIL和Boost,所以我先设置它.它适用于Devil和Boost头文件,所以我假设我不需要BOOST_ROOT变量.Boost安装是我用BJam编译的boost.org的标准源代码.这些库存储在boost_1_47_0\bin.v2\libs,并且我没有在构建过程中更改任何内容.
我认为这有点奇怪,该boost_1_47_0\libs文件夹不包含任何库文件,但BJam文件和其他东西,但这不应该是一个问题,因为这似乎是从源代码在Windows上构建Boost的常规方法.
我查看了FindBoost.cmake文件中的Debug输出(我使用的是CMake 2.8中的默认脚本)并且它似乎没有查看bin.v2.相反,它搜索boost_ROOT/lib,但当我将内容从bin.v2\libslib 复制到lib时,它仍然没有找到任何东西.
那么找到Boost的优雅方法是什么呢?它也适用于其他具有常见Boost发行版的平台?
我正在为我的项目使用cmake.不,我想将一些部分拆分成一个库,并将其用于两个不同的应用程序.
现在我不知道如何在cmake中做这个子项目.我的第一次尝试是使用add_subdirectory命令:
cmake_minimum_required(VERSION 2.8)
add_subdirectory(MSI)
message("Building MsiQtWizard with: ${MSI_INCLUDE_DIR}")
add_subdirectory(MsiQtWizard)
Run Code Online (Sandbox Code Playgroud)
所以MSI将成为我的图书馆.在MSI文件夹中是另一个cmakelists,它基本上是用于构建库的独立列表.我想我可以让MsiQtWizard项目也成为一个独立的cmakelists,所以我理论上可以构建MSI并使用该库来构建MsiQtWizard(以及其他项目).
根目录中的cmakelists只是一个帮助,可以在一个步骤中构建库和GUI.
问题是,为了构建MsiQtWizard,我需要msi的包含路径和静态库二进制文件.我试图在MIS/CMakelists.txt的末尾做类似的事情:
### Set variables, other scripts may use ###
SET(MSI_INCLUDE_DIR include)
MESSAGE("Include directory is: ${MSI_INCLUDE_DIR}")
Run Code Online (Sandbox Code Playgroud)
并在MsiQtWizard/CMakelists中:
##### external libraries #####
#MSI
find_path(MSI_INCLUDE_DIR REQUIRED msi/Image.hpp
PATH_SUFFIXES MSI/include include)
Run Code Online (Sandbox Code Playgroud)
我的意思是,MsiQtWizard将搜索msi,如果先前没有设置变量(这样你就可以将这个cmakelists用作独立的).在构建MSI时,我想保存包含路径(以及后来的二进制位置)并将其传递给MsiQtWizard - 但是一旦我回到我的根cmakelists中,该值就消失了.
那就是我尝试过的.我的问题现在是:我如何正确地将我的项目拆分成一个库和一个(后来的多个)应用程序,我能以一种我可以独立构建它的方式来实现吗?
或者,更具体:如何将值从节点CMakelist传递到根CMakeList(就像我尝试使用MSI_INCLUDE_DIR)?
在我最近的项目中,我遇到了一个问题,即某些值经常被误解.例如,我计算一个波作为两个波的总和(我需要两个振幅和两个相移),然后在4个点采样.我将这四个值的元组传递给不同的函数,但有时我错误地传递波参数而不是采样点.
这些错误很难找到,因为所有计算都没有任何错误,但在这种情况下,这些值完全没有意义,因此结果是错误的.
我现在想要的是某种语义类型.我想声明一个函数返回样本点而另一个函数等待样本点,并且我不会做任何会在没有立即出错的情况下与此声明冲突的事情.
有没有办法在python中这样做?