从C++来源的C-DLL
我有一个用于我的C ++框架的C-Wrapper.由于这应该在Mac和Windows上运行,所以我使用 SCONS : env = Environment() env.Append(CPPPATH = ['./']) env.Append(LIBS = 'kernel32.lib') env.Append(LIBPATH = 'C:/Program Files/Microsoft SDKs/Windows/v6.0A/Lib') env.SharedLibrary(target='warpLib', source='warplib.cpp') warplib.cpp和warplib.h的简单版本看起来像: warplib.cpp #define DllExport __declspec( dllexport ) #include "warplib.h" extern "C" { DllExport int foo(int a) { return a;
0 2024-04-09
编程技术问答社区
SConscript 中共享库的 CCCOMSTR/LINKCOMSTR 将不起作用
我是SCONS的新手,并注意到当我在Sconscript中构建共享库时,CCCOMSTR和LINKCOMSTR将无法使用. 这是我的Sconstruct的简化版本: CFLAGS = ["-Wall", "-pedantic", "-std=c99"] # building environment env = Environment(CFLAGS = CFLAGS, CPPDEFINES = ["DEBUG"]) # checking dependencies conf = env.Configure() conf.CheckHeader("stdlib.h") conf.CheckHeader("string.h") conf.CheckLib("libdl") env["CCCOMSTR"] = "Compiling $SOURCE ..." env["LINKCOMSTR"] = "Linking $TARGET ..." SConscript(di
0 2024-04-09
编程技术问答社区
SCons图书馆和子图书馆
我有一个基于SCON的分层构建系统.我有一个root sconstruct,该scomstruct将其调用到一个sconscript中,该sconscruct构建共享库,然后陷入另一个sconscript,该库构建构建取决于共享库的可执行文件. 所以这是我的问题:我对Linux上共享库的理解是,当您想执行将使用共享lib的可执行文件链接时,共享的lib必须包含在可执行文件的ld命令行作为引用它的来源(除非它在标准位置,在这种情况下,-l选项有效). 所以这是我的SCONS文件的外观: === rootdir/sconstruct env=DefaultEnvironment() shared_lib = SConscript('foolib/SConscript') env.Append( LIBS=[shared_lib] ) executable = SConscript('barexec/SConscript') === rootdir/hoodib/s
2 2024-04-08
编程技术问答社区
项目目录中的scons可执行文件+共享库
这是一个示例sconscript文件: env = Environment() hello_lib = env.SharedLibrary('hello', ['libhello.c']) exe = env.Program('main', ['main.c'], LIBS=hello_lib) env.Install('/usr/lib', hello_lib) env.Install('/usr/bin', exe) env.Alias('install', '/usr/bin') env.Alias('install', '/usr/lib') 它构建了一个共享库,一个可执行文件链接到该库: $ scons scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... gcc -o libhello.os -c -fPIC
2 2024-04-08
编程技术问答社区
如何根据编译器类型在SConstruct中设置C编译器的选项?
我需要为C编译器设置其他选项,例如添加标志以打开所有警告,具体取决于编译器的类型.例如.对于MSVC,我应该使用 env.Append(CPPFLAGS = "/Wall") 但是对于mingw(GCC),我需要使用: env.Append(CCFLAGS = "-Wall") 我该如何以SCONS的方式执行此操作? 解决方案 您可以检查编译器的名称: cc = env['CC'] if cc == 'cl': env.Append(CPPFLAGS = '/Wall') elif cc == 'gcc': env.Append(CCFLAGS = '-Wall')
0 2024-04-08
编程技术问答社区
如何在用SCons构建的程序中内置gprof支持?
问候, 这是我的Sconstruct文件: env = Environment() env.Append(CCFLAGS=['-g','-pg']) env.Program(target='program1', source= ['program1.c']) 这也是汇编的输出: scons: Reading SConscript files ... scons: done reading SConscript files. scons: Building targets ... gcc -o program1.o -c -g -pg program1.c gcc -o program1 program1.o scons: done building targets. 您可以看到我将" -pg"选项传递给构建环境.构建后,我运行该程序以生成" gmon.out",但没有产生. 谁能确认这个问题?或有解决方案? 谢谢. 更新: 感谢此处给出的
0 2024-04-08
编程技术问答社区
为什么SCons VariantDir()不把输出放在给定的目录中?
我正在考虑使用 scons 作为一个新项目.看起来真的很好,尽管我发现VariantDir很困惑. 我有一个简单的项目,其中一个目录中有少数C源文件,我想以"正常"和"配置文件"模式构建 - 与GCC一起使用两套不同的选项.我希望输出分别在正常/和配置文件/目录中进行. 用于测试,我只缩短了一个源文件T.C,其中包含main().我的SConstruct文件在同一目录中,看起来像这样: normal = DefaultEnvironment(tools=['mingw'], CCFLAGS = '-O2') normal.VariantDir('release', '.', duplicate=0) normal.Program('t', ['t.c']) #profile = normal.Clone(CCFLAGS='-O2 -pg', LINKFLAGS = '-pg') #profile.VariantDir('profile', '.', duplicate
0 2024-04-07
编程技术问答社区
用SCons对编译器诊断进行着色
我目前正在使用 colorama colorama 包装供我的构建脚本生成的色彩消息.我还使用了 scolorizer ,该用SCONS中的strfunction()替换构建命令.这肯定会使构建输出更少的详细和警告更容易发现. 但是,我通常更喜欢在构建时看到完整的命令行. scons 是否有机制捕获编译器输出,从而有机会在打印出来之前注入一些终端颜色? 解决方案 您可以通过将环境中的CC和CXX设置为编译器周围的合适包装器来做到这一点,例如 colorgcc .
0 2024-04-05
编程技术问答社区
如何在SCons构建中添加前处理和后处理动作?
使用SCONS构建项目时,我正在尝试添加预处理和后处理. Sconstruct和Sconscript文件位于项目的顶部. 预处理动作: 生成代码(通过调用不同的工具): - >不知道此预处理后将生成的确切文件(用于确定可以生成哪些文件以与它们一起馈送SCON的其他预处理) - >运行外部脚本(Python,Pearl脚本),在编译之前执行 后期操作: - >运行外部工具,运行链接后应执行的外部脚本 我迄今为止尝试的是: 用于预处理: 为了运行CMD,使用OS.System. (正常工作,但我正在寻找" SCONS解决方案") 使用SCONS使用AddPreAction(target, action)函数.不幸的是,按照SCONS用户手册所述,该功能是在编译项目后执行的:"The specified pre_action would be executed before scons calls the link command that a
6 2024-04-05
编程技术问答社区
SCons和/或CMake:有没有办法将 "编译时包含的头文件 "自动映射到 "必须链接相应的对象文件"?
超简单,完全无聊的设置:我有一个装满.hpp和.cpp文件的目录.其中一些.cpp文件需要内置到可录取中;自然,这些.cpp文件#include在同一目录中的某些.HPP文件,然后可能包括其他文件等.大多数这些.hpp文件都有相应的.cpp文件,也就是说:如果some_application.cpp.cpp #includes foo.hpp,直接或传统上,也有一个foo.cpp文件,需要编译并链接到Some_application可执行文件中. 超级简单,但我仍然对建造它的"最佳"构建方式毫无意义大约是悲伤的).我担心那种解决方案i 想要实际上可能是不可能的(或至少是严重复杂的)在大多数构建系统中都可以实现,但是如果是的话,很高兴知道,所以我可以只是放弃,挑剔.自然,我希望自己错了,这并不奇怪,因为我对构建系统有多么无知(总的来说,尤其是CMAKE和SCON). cmake and Scons当然可以自动检测到some_application.cpp需要在任何依赖的标头文件
0 2024-04-05
编程技术问答社区
用scons确定复杂构建的源文件列表(*.[ch])。
假设您有一个用于C项目的复杂源树,很多目录都有很多文件. SCON构建支持多个目标(I386,SPARC,PowerPC)和多个变体(调试,发行版).在根上有一个sconstruct(引用各种sconscripts),可以为所有这些做正确的事情,当用指定目标和变体的参数调用时,例如scons target=i386 variant=release. 是否有一种简单的方法来确定每个构建的源文件( *.c和 *.h)的使用(它们都略有不同)?我的理论是,SCONS需要计算此文件集,以了解要编译哪些文件以及何时重新编译的文件.它可以提供此信息吗? 我做的不是想做: 记录一个详细的构建和后处理(无论如何可能不会告诉.h文件) 在 理想情况下,我想做scons target=i386 variant=release printfileset,然后查看 *.文件的正确列表.然后,此列表可以用作进一步的源文件弹式工具(例如doxygen)的输入. 解决方案 这里有几个
0 2024-04-05
编程技术问答社区
使用SCons的真正分层构建?
所以我已经在这里阅读了有关层次结构构建的问题,例如:创建层次结构用Scons 建造 我想对两个独立的存储库进行真正的层次结构,这两者都使用我使用Mercurial设置为子repos的SCON.以下是说明我想做什么的文件布局. 所需的布局: project_root/ (new project that builds bar app using the libfoo built from source) libfoo_subrepo/ (standalone project repo from bitbucket) src/ SConscript libfoo.c libfoo.h test/ SConscript test_foo.c SConstruct barapp_subrep
2 2024-04-05
编程技术问答社区
ant+cpptasks vs. scons vs. make
我正在研究 scons ,我只想确保我知道替代方案是什么我将大部分脑细胞投入到完全不同的东西中.我过去一直在使用GNU制作,但从未对此感到特别满意. 特别是:为什么ANT不经常使用C/C ++项目? (鉴于有 ant cpptasks )围绕Java更加定向(显然),但是这样做的弊端是什么?为什么Scons比制造要好得多? 我正在与ti DSP的跨编译器合作,通常项目中有20-50个CPP文件.构建管理中的困难部分似乎是自动依赖性检查.其他所有内容只是将文件列表与编译器选项集映射. 编辑:,为什么交叉兼容会改变任何东西?这是一个按照GCC运行方式运行的编译器,只是它会产生不会在我的PC上运行的对象文件/可执行文件. 解决方案 用于交叉编译,我认为您的最佳选择是 cmake cmake autotools .特别是如果您可以为多个架构/平台编译代码.我通常会在本机计算机上编译代码的一个子集,以实现单元测试目的,所有代码都用于目标平台. Cmake可以很好地处理这一
2 2024-04-05
编程技术问答社区
如何用Eclipse CDT构建SCons项目?
我们使用SCONS进行建筑物有一个相当大的C/C ++项目.我想尝试通过Eclipse-CDT构建它.任何人都有任何经验,可以告诉我将SCONS设置为建造者的步骤. (不使用Sconsbuilder插件,它将无法与Fedora-11的Eclipse-CDT一起使用). 解决方案 我已经尝试过 waf in eclipse cdt 此前,Scons真的很相似.解决方案是创建一个空的makefile项目,然后只需在选项中将" make"更改为" scons".在路径中可能需要SCONS.BAT文件的窗口上.这比创建具有all:\n\tscons类型模式的虚拟制作file(但最少的工作)要好得多. sconsbuilder plugin 不是一个好主意.它在其中有一大堆硬编码的Python代码,可以吐到sconstruct.它已经没有多年更新,到现在为止,SCON可能会弃用很多代码.我认为一种更好的方法是为SCONS为Visual Studio做些什么,或CMAKE为Eclips
2 2024-04-05
编程技术问答社区
从Repository()编译的源代码没有被放在Hierarchical SCons项目的variant dir中。
我有一个分层项目,该项目使用来自通用系统目录的源代码,为此我使用SCONS Repository()函数,并希望将所有构建输出(本地代码和从存储库中获取的本地代码和代码)放在variant_dir中. 如果我在简单的方案中使用Repository()函数(非北方式的,没有呼叫子目录sconscripts),则按预期将compilet reposository()对象文件放置在variant_dir中.但是,如果我在层次构建中执行相同的操作,则将编译的Repository()对象文件放置在项目根目录中. 假设我想使用位于系统目录中的以下源代码: /usr/local/repoDir/repoFile.cc 我有以下项目结构: # tree . . |-- SConstruct |-- build | `-- linux_x86_64 `-- moduleA |-- localFile.cc `-- SConscript 这是构建脚本:
0 2024-04-04
编程技术问答社区
我如何在scons中每次构建后运行一些代码?
我正在寻找一种像SCONS中的最终建造回调一样注册的方法.例如,我现在正在做这样的事情: def print_build_summary(): failures = SCons.Script.GetBuildFailures() notifyExe = 'notify-send ' if len(failures) > 0: notifyExe = notifyExe + ' --urgency=critical Build Failed' else: notifyExe = notifyExe + ' --urgency=normal Build Succeed' os.system(notifyExe) atexit.register(print_build_summary) 这仅在非相互作用模式下起作用.我希望能够在每个构建的末尾弹出类似的内容,特别是在交互式SCONS会话中运行多个"构建"命令时
0 2024-04-04
编程技术问答社区
如何让项目将其构建输出放在与Scons相同的目录中?
背景 我通过设置一个具有两个子项目的基本C ++样本项目来尝试SCONS: PRJ1是依赖PRJ2的EXE PRJ2是导出某些功能的DLL 我遇到的问题是库构建其.obj,.pdb,.lib,.dll等.在EXE在EXE中以与Sconscript文件同一目录中的文件构建其文件与同一目录中的文件构建文件它的sconscript.该应用程序成功地构建了PRJ2依赖性和本身.但是,您无法运行由此产生的EXE,因为它找不到所需的库,因为它在其他目录中. 问题 在 潜在解决方案 这是我到目前为止所想到的: 我尝试使用variantdir(以前称为builddir),但是这似乎不起作用.也许我在这里弄乱了一些东西. 我可以显式地告诉编译器和链接器(例如,通过fo/fd)在哪里删除文件(这是最好的或唯一的解决方案???) 在由此产生的二进制文件上执行复制命令(这似乎是一个黑客,很难管理/维护) 更新 我更新了下面的文件结构和文件内容,以全面反映
0 2024-04-04
编程技术问答社区
Autotools、Cmake和Scons之间有什么区别?
自动工具,CMAKE和SCON之间有什么区别? 解决方案 实际上,Autotools'唯一的"拯救恩典"是所有GNU项目在很大程度上使用的. 自动工具的问题: 真正的奥术M4宏观语法与详细的,扭曲的外壳脚本结合了"兼容性"的测试,等等. 如果您不关注,您 将 弄乱交叉补偿能力(IT 应该清楚地指出,诺基亚提出了Scratchbox/ScratchBox2到侧键 高度 损坏的自动工具为Maemo/Meego构建设置. ,测试中的静态路径,您将打破跨编译支持,因为它不会符合您的SYSROOT规范,并且会从主机系统中拉出东西.如果您违反跨编译支持,它将使您的代码无法使用 openembedded,使试图在交叉补偿器上而不是在目标上构建其发行版的发行版变得"有趣". 对古老的,破碎的编译器的问题进行了大量测试,这些问题 当今这个时代,当前几乎可以生产任何东西.除非您在真正的 古代 版本的Solaris,Aix或类似版本上构建Glibc,libstdc ++或GCC之类
2 2024-04-04
编程技术问答社区
用类似的规则构建多个可执行文件
我正在写某种东西喜欢C ++的交互式教程.本教程将由两个部分组成:一个部分被编译到库中(我正在使用SCONS来构建该图书馆),另一个(课程)则以最终用户编译的教程运送了(课程).我目前正在寻找一种让人们建立这些课程的好方法. 基本上,第二部分是一个目录,其中所有课程中的所有课程都在其自己的目录中.每个课程至少都有一个lesson.cpp和a main.cpp文件,也可能还有其他文件,直到发货后,我才知道的存在 - 最终用户将创建这些文件.看起来像这样: all_lessons/ helloworld/ lesson.cpp main.cpp even_or_odd/ lesson.cpp main.cpp calculator/ lesson.cpp main.cpp user_created_add.cpp 所有这些都需要根据几乎相同的
0 2024-04-04
编程技术问答社区
SCons自定义构建器-用多个文件构建并输出一个文件
如果我有一个可执行的可执行文件,一次从多个文件中生成输出 - generate_output -o a.out -f input1.txt input2.txt input3.txt 有没有办法为此编写这样的自定义建筑商? 我目前拥有的是 - builder = Builder( action='generate_output -o $TARGET -f $SOURCE', suffix='.out', src_suffix='.txt') 然后它仅以序列生成文件,这不是我真正想要的 - generate_output -o input1.out -f input1.txt generate_output -o input2.out -f input2.txt # etc... 解决方案 尝试使用$SOURCES,请参阅变量替换: builder = Builder( action='generate_
0 2024-04-04
编程技术问答社区