如何在 SCons 运行时 link exe with dll

How to link exe with dll at runtime in 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)

它的目标是打印使用 [​​=13=] 创建的测试。但是,在我将 boost_unit_test_framework-vc140-mt-1_60.dll 复制到包含 exe 的文件夹之前,出现有关缺少 dll 的错误。使用 dll 复制它显然可以工作,但是是否有任何技巧可以 "link" 将 dll 执行以使其知道它在运行时的位置?提到的 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) 行之后。但是,由于 PATH.

中没有合适的库,因此以后无法从 cmd 执行它们

尽管如此,我仍在寻找独立于平台的解决方案。

此问题没有跨平台解决方案,因为共享库在二进制文件中的方式 referenced/located 因平台而异。

假设您只使用 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 )