如何在 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 )
我在 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 )