链接器无法从scons找到不同目录中的对象文件 [英] linker could not found object files from different directory with scons
问题描述
目前,我做一个项目与scons。
我编译了源代码,现在是链接它们的时候了。
但是,我得到一个错误,ld找不到对象文件。
SConscript位于src / kernel32中,
import os,sys
#编译CPP
env_gpp_options = {
'CXX':'x86_64-pc -linux-g ++',
'CXXFLAGS':'-std = c ++ 11 -g -m32 -ffreestanding -fno-exceptions -fno-rtti',
'LINK':'x86_64-pc -linux-ld',
'LINKFLAGS':'-melf_i386 -T scripts / elf_i386.x -nostdlib -e main -Ttext 0x10200',
}
env_gpp = Environment(** env_gpp_options )
env_gpp.Append(ENV = {'PATH':os.environ ['PATH']})
object_cpp_list = Glob('*。cpp')
for object_cpp in object_cpp_list:
env_gpp.Object(object_cpp)
#查找所有对象文件
object_target_list = Glob('*。o')
#Linking
env_link_target ='kernel32.elf'
env_gpp.Program(env_link_target,object_target_list)
,并且得到的消息是
x86_64-pc-linux-g ++ -o build / kernel32 / cpu.o -c -std = c ++ 11 -g -m32 -ffreestanding -fno-exceptions -fno-rtti src / kernel32 / cpu.cpp
x86_64-pc-linux-g ++ -o build / kernel32 / main.o -c -std = c ++ 11 -g -m32 -ffreestanding -fno-exceptions -fno-rtti src / kernel32 / main.cpp
x86_64-pc-linux-g ++ -o build / kernel32 / memory.o -c -std = c ++ 11 -g -m32 -ffreestanding -fno-exceptions -fno-rtti src / kernel32 / memory.cpp
x86_64-pc-linux-g ++ -o build / kernel32 / pageManager.o -c -std = c ++ 11 -g -m32 -ffreestanding -fno-exceptions -fno-rtti src / kernel32 / pageManager.cpp
x86_64-pc-linux-g ++ -o build / kernel32 / utils.o -c -std = c ++ 11 -g -m32 -ffreestanding -fno-exceptions -fno-rtti src / kernel32 / utils.cpp
x86_64-pc-linux-ld -o build / kernel32 / kernel32.elf -melf_i386 -T scripts / elf_i386.x -nostdlib -e main -Ttext 0x10200 build / kernel32 / asmUtils.o build / kernel32 / cpu.o build / kernel32 / main.o build / kernel32 / memory.o build / kernel32 / pageManager.o build / kernel32 / utils.o
x86_64-pc-linux-ld:找不到main.o
scons:*** [build / kernel32 / kernel32.elf]错误1
scons:由于错误而终止构建。
我检查了目录build / kernel32 /,发现main.o文件。
我的错误是什么?
有没有办法改变工作目录为scons?
请让我知道我错过了什么。
在项目根目录中,
$ b $
#SConstruct
build_dir ='build'
#Build
SConscript(['src / SConscript' ],variant_dir = build_dir,duplicate = 0)
清除
清除('。',build_dir)
在src目录
#SConscript为src
SConscript bootloader / SConscript',
'kernel32 / SConscript'])
p>
#SConscript for kernel32
import os,sys
#Build entry
env_entry = Environment(tools = ['default','nasm'])
target_entry ='entry.bin'
object_entry ='entry.s'
output_entry = env_entry.Object(target_entry,object_entry)
#编译CPP
env_gpp_options = {
'CXX':'x86_64-pc-linux-g ++',
'CXXFLAGS':'-std = c ++ 11 -g -m32 -ffreestanding -fno-exceptions -fno-rtti',
'LINK':'x86_64-pc-linux-ld',
'LINKFLAGS':'-melf_i386 -T scripts / elf_i386.x -nostdlib -e main -Ttext 0x10200',
}
env_gpp = Environment(** env_gpp_options)
env_gpp。在object_cpp_list中的object_cpp中添加(ENV = {'PATH':os.environ ['PATH']})
object_cpp_list = Glob('*。cpp')
env_gpp.Object(object_cpp)
#编译ASM
env_nasm = Environment(tools = ['default','nasm'])
env_nasm.Append(ASFLAGS =' - f elf32')
object_nasm_list = Glob('*。asm')
object_nasm_list中的object_nasm:
env_nasm.Object(object_nasm)
#查找所有对象文件
object_target_list = Glob('*。o')
object_target_list.append('entry.bin')
#链接
env_link_target ='kernel32.elf'
env_gpp.Program(env_link_target,object_target_list)
感谢您的关注。
Currently, I make a project with scons. I compiled source codes and it is time to link them. However, I got an error that ld cannot find object files.
The SConscript is located in src/kernel32, and
import os, sys # Compile CPP env_gpp_options = { 'CXX' : 'x86_64-pc-linux-g++', 'CXXFLAGS' : '-std=c++11 -g -m32 -ffreestanding -fno-exceptions -fno-rtti', 'LINK' : 'x86_64-pc-linux-ld', 'LINKFLAGS' : '-melf_i386 -T scripts/elf_i386.x -nostdlib -e main -Ttext 0x10200', } env_gpp = Environment(**env_gpp_options) env_gpp.Append(ENV = {'PATH' : os.environ['PATH']}) object_cpp_list = Glob('*.cpp') for object_cpp in object_cpp_list: env_gpp.Object(object_cpp) # Find all object file object_target_list = Glob('*.o') # Linking env_link_target = 'kernel32.elf' env_gpp.Program(env_link_target, object_target_list)
and message I got is
x86_64-pc-linux-g++ -o build/kernel32/cpu.o -c -std=c++11 -g -m32 -ffreestanding -fno-exceptions -fno-rtti src/kernel32/cpu.cpp x86_64-pc-linux-g++ -o build/kernel32/main.o -c -std=c++11 -g -m32 -ffreestanding -fno-exceptions -fno-rtti src/kernel32/main.cpp x86_64-pc-linux-g++ -o build/kernel32/memory.o -c -std=c++11 -g -m32 -ffreestanding -fno-exceptions -fno-rtti src/kernel32/memory.cpp x86_64-pc-linux-g++ -o build/kernel32/pageManager.o -c -std=c++11 -g -m32 -ffreestanding -fno-exceptions -fno-rtti src/kernel32/pageManager.cpp x86_64-pc-linux-g++ -o build/kernel32/utils.o -c -std=c++11 -g -m32 -ffreestanding -fno-exceptions -fno-rtti src/kernel32/utils.cpp x86_64-pc-linux-ld -o build/kernel32/kernel32.elf -melf_i386 -T scripts/elf_i386.x -nostdlib -e main -Ttext 0x10200 build/kernel32/asmUtils.o build/kernel32/cpu.o build/kernel32/main.o build/kernel32/memory.o build/kernel32/pageManager.o build/kernel32/utils.o x86_64-pc-linux-ld: cannot find main.o scons: *** [build/kernel32/kernel32.elf] Error 1 scons: building terminated because of errors.
I checked the directory, build/kernel32/, and I found main.o file. What is my mistake? Is there an way to change working directory for scons?
Please let me know what I missed.
解决方案This is full scons scripts.
In project root directory,
#SConstruct build_dir = 'build' # Build SConscript(['src/SConscript'], variant_dir = build_dir, duplicate = 0) # Clean Clean('.', build_dir)
In src directory
#SConscript for src SConscript(['bootloader/SConscript', 'kernel32/SConscript'])
In kernel32 directory
#SConscript for kernel32 import os, sys # Build entry env_entry = Environment(tools=['default', 'nasm']) target_entry = 'entry.bin' object_entry = 'entry.s' output_entry = env_entry.Object(target_entry, object_entry) # Compile CPP env_gpp_options = { 'CXX' : 'x86_64-pc-linux-g++', 'CXXFLAGS' : '-std=c++11 -g -m32 -ffreestanding -fno-exceptions -fno-rtti', 'LINK' : 'x86_64-pc-linux-ld', 'LINKFLAGS' : '-melf_i386 -T scripts/elf_i386.x -nostdlib -e main -Ttext 0x10200', } env_gpp = Environment(**env_gpp_options) env_gpp.Append(ENV = {'PATH' : os.environ['PATH']}) object_cpp_list = Glob('*.cpp') for object_cpp in object_cpp_list: env_gpp.Object(object_cpp) # Compile ASM env_nasm = Environment(tools=['default', 'nasm']) env_nasm.Append(ASFLAGS='-f elf32') object_nasm_list = Glob('*.asm') for object_nasm in object_nasm_list: env_nasm.Object(object_nasm) # Find all object file object_target_list = Glob('*.o') object_target_list.append('entry.bin') # Linking env_link_target = 'kernel32.elf' env_gpp.Program(env_link_target, object_target_list)
Thank you for your attention.
这篇关于链接器无法从scons找到不同目录中的对象文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!