如何在运行时在SCons中链接exe与DLL

时间:2016-03-29 16:24:16

标签: dll runtime scons

我在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之后执行它们。

我仍在寻找独立于平台的解决方案。

1 个答案:

答案 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