我在SCons中有以下代码:
env = Environment()
env.Append(CCFLAGS = ['/W1', '/EHsc', '/O2', '/MD'])
boost_include = 'C:/Boost160'
boost_libs = 'C:/Boost160/libs'
boost_bin = 'C:/Boost160/lib64-msvc-14.0'
env.Append( CPPPATH = boost_include, LIBPATH = [boost_libs, boost_bin] )
tests = []
tests += env.Program( 't', 'src/test1.cpp')
tests += env.Program( 't2', 'src/test2.cpp')
for test in tests:
command = env.Command( None , test, '$SOURCE > $TARGET' )
AlwaysBuild(command)
目标是打印使用boost::test
创建的测试。但是,在将boost_unit_test_framework-vc140-mt-1_60.dll
复制到包含exe的文件夹之前,有一个关于缺少dll的错误。使用dll复制它显然工作,但有没有任何技巧将dll“链接”到exe,所以它知道它在运行时的位置?提到的dll位于boost_bin
目录中。我的测试文件是:
#define BOOST_TEST_DYN_LINK
#define BOOST_TEST_MODULE Test1
#include <boost/test/unit_test.hpp>
bool isEven(int a) {
return a % 2 != 0;
}
BOOST_AUTO_TEST_CASE( my_test )
{
BOOST_CHECK( isEven(1) == true );
}
BOOST_AUTO_TEST_CASE( my_test2 )
{
BOOST_CHECK( isEven(2) == false );
}
BOOST_AUTO_TEST_CASE( my_test3 )
{
BOOST_CHECK( isEven(3) == true );
}
修改
添加env.AppendENVPath('PATH', boot_bin)
行后,我的测试正在运行。但是,由于cmd
中没有适当的库,因此无法在PATH
之后执行它们。
我仍在寻找独立于平台的解决方案。
答案 0 :(得分:0)
这个问题不是跨平台解决方案,因为共享库在二进制文件中的引用/位置方式因平台而异。
假设你只使用win32 / 64和linux,你可以使用两种逻辑来实现。 (以下代码未经测试)
import sys
env = Environment()
env.Append(CCFLAGS = ['/W1', '/EHsc', '/O2', '/MD'])
boost_include = 'C:/Boost160'
boost_libs = 'C:/Boost160/libs'
boost_bin = 'C:/Boost160/lib64-msvc-14.0'
env.Append( CPPPATH = boost_include, LIBPATH = [boost_libs, boost_bin] )
if sys.platform != 'win32':
env.Append(RPATH = [boost_libs, boost_bin])
else:
env.Install('.',env.Glob(boost_libs+"/*.dll")+env.Glob(boost_bin+"*.dll"))
tests = []
tests += env.Program( 't', 'src/test1.cpp')
tests += env.Program( 't2', 'src/test2.cpp')
for test in tests:
command = env.Command( None , test, '$SOURCE > $TARGET' )
AlwaysBuild(command)
有一点需要注意的是,有一个scons用户邮件列表,您可能会在您可能遇到的任何问题上获得更多关于scons知识的眼睛。 (https://pairlist4.pair.net/mailman/listinfo/scons-users)