C++,链接时出错。用 scons 构建

Posted

技术标签:

【中文标题】C++,链接时出错。用 scons 构建【英文标题】:C++, error while linking. Building with scons 【发布时间】:2013-05-14 23:04:25 【问题描述】:

我尝试使用 scons 运行构建示例 Wt 项目,但有几个小时我被卡住了。 当我用命令编译它时:

g++ -o hello hello.cc -I/usr/local/include -L/usr/local/lib
  -lwthttp -lwt -lboost_random -lboost_regex
  -lboost_signals -lboost_system -lboost_thread -lboost_filesystem
  -lboost_program_options -lboost_date_time

(教程链接:http://www.webtoolkit.eu/wt/doc/tutorial/wt.html#_hangman) 一切正常,我可以运行这个简单的例子。 但是用我的 scons 文件:

env = Environment()

#       Add header search path
env.Append(CPPPATH = ['/usr/include', '/usr/local/include'])

#       Add compile-time flags
env.Append(CCFLAGS=[
#'-Wall','-g',
'-lwt', '-lwthttp',
'-lboost_random', '-lboost_regex', '-lboost_signals',
'-lboost_system', '-lboost_thread', '-lboost_filesystem',
'-lboost_program_options', '-lboost_date_time'
])

#       Add library search path
env.Append(LIBPATH = ['/usr/lib','/usr/local/lib', '/opt/lib'])

env.Program('hello',['exa.cc'])

#Program('exa.cc')
~                                        

我不能并得到以下错误:http://pastebin.com/Ft2b62ie。 感谢您的任何回答。

卢卡斯。

【问题讨论】:

根据错误消息,您没有使用库编译它。请参阅消息中的第 6 行。 当我将以下路径移动:'/usr/lib'、'/usr/local/lib'、'/opt/lib' 到 CPPPATH 包含的位置时,我收到相同的错误消息。 不,我的意思是图书馆本身。尝试使用上面编写的命令在终端中编译。 g++ -o hello hello.cc -I/usr/local/include -L/usr/local/lib -lwthttp -lwt -lboost_random -lboost_regex -lboost_signals -lboost_system -lboost_thread -lboost_filesystem -lboost_program_options -lboost_date_time 是的,我是通过命令行写的,一切都能正常编译。问题出在我的 scons 文件中,但我不知道为什么.. 对不起,我不知道 scons,但是为什么 [] 中的每个列表除了 env.Program('hello',['exa.cc']) -> 你好?可能应该是env.Program(['hello','exa.cc']),或者你不需要像env.Program(['hello'])env.Program('hello') 这样的exa.cc。 【参考方案1】:

以下 SConstruct 应该适合您: 唯一的区别是将库放在 LIBS SCons 构造变量中并从每个库中删除“-l”,因为它在 SCons 中不是必需的。

(请注意,这与 user2093113 的答案基本相同,但正确指定了库:https://***.com/a/16555400/1158895)

env = Environment()

#       Add header search path
env.Append(CPPPATH = ['/usr/include', '/usr/local/include'])

#       Add compile-time flags
#env.Append(CCFLAGS=['-Wall','-g'])

# libraries to link against
# Notice you dont need the '-l', since SCons is platform independent
env.Append(LIBS=[
  'wt', 'wthttp',
  'boost_random', 'boost_regex', 'boost_signals',
  'boost_system', 'boost_thread', 'boost_filesystem',
  'boost_program_options', 'boost_date_time'
])

#       Add library search path
env.Append(LIBPATH = ['/usr/lib','/usr/local/lib', '/opt/lib'])

# Compile and link the binary
env.Program('hello',['exa.cc'])

【讨论】:

【参考方案2】:

您的链接器标志不应附加到CCFLAGS,而应附加到LIBS

env.Append(LIBS=[
'-lwt', '-lwthttp',
'-lboost_random', '-lboost_regex', '-lboost_signals',
'-lboost_system', '-lboost_thread', '-lboost_filesystem',
'-lboost_program_options', '-lboost_date_time'
])

【讨论】:

这不是用 SCons 指定库的正确方法,我很惊讶它没有给出某种错误或警告。不应指定“-l”标志,SCons 会添加这些标志。

以上是关于C++,链接时出错。用 scons 构建的主要内容,如果未能解决你的问题,请参考以下文章

scons构建mdk工程

scons构建mdk工程

利用scons构建project

Scons - 使用带有 scons 缓存的自定义预处理器

WSL + Scons:无此类文件或目录

使用 SCons 着色编译器诊断