Directory 如何更改SCON中的工作目录
我有一个用make构建的项目,但我想转向scons 但是,我无法链接SCON中的对象文件,所以我想知道如何更改SCON中的工作目录 我真正想要的是Directory 如何更改SCON中的工作目录,directory,makefile,ld,scons,Directory,Makefile,Ld,Scons,我有一个用make构建的项目,但我想转向scons 但是,我无法链接SCON中的对象文件,所以我想知道如何更改SCON中的工作目录 我真正想要的是 make -C $(OBJECTDIRECTORY) -f $(SOURCEDIRECTORY)./Makefile InternalDependency 这是我的Makefile中的一行,运行良好 然而,当scons构建我的项目时,它确实是这样做的 x86_64-pc-linux-ld -o build/kernel32/kernel32.elf
make -C $(OBJECTDIRECTORY) -f $(SOURCEDIRECTORY)./Makefile InternalDependency
这是我的Makefile中的一行,运行良好
然而,当scons构建我的项目时,它确实是这样做的
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
。即使我在shell中手动执行相同的命令,我也会得到相同的错误
但是,如果我移动到build/kernel32,并手动执行
x86_64-pc-linux-ld -o kernel32.elf -melf_i386 -T ../../elf_i386.x -nostdlib -e main -Ttext 0x10200 main.o cpu.o memory.o pageManager.o utils.o asmUtils.o
它是有效的
我的假设是ld无法链接某个上层目录中的对象文件
那么,有什么方法可以实现Make的“-C”选项吗?
还是在scons中的其他解决方法
这是我的笔录和笔录
在项目根目录中
#SConstruct
build_dir = 'build'
# Build
SConscript(['src/SConscript'], variant_dir = build_dir, duplicate = 0)
# Clean
Clean('.', build_dir)
在src目录中
#SConscript for src
SConscript(['bootloader/SConscript',
'kernel32/SConscript'])
#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)
在内核32目录中
#SConscript for src
SConscript(['bootloader/SConscript',
'kernel32/SConscript'])
#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)
请让我知道。多谢各位
“--tree=prune”的日志为
这不是你在这里遇到的同一个问题吗:发布:strace-o日志文件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.obuild/kernel32/utils.oAlso发布:scons--tree=pruneYes的输出,这个问题与您提到的问题相同。我比较了Makefile和SConscript,我认为我需要与make的“-C”选项相同的功能。所以我改变了我的问题。@bdbaddog,我为我的项目尝试了strace,我发现有两个结果。当我在清理之后执行此操作时,它不会创建构建目录。然而,若我执行“scons”,然后执行strace,它将创建构建目录并显示相同的错误。所以我和dropbox分享这两个。这是给斯特拉斯的,这是斯科斯和斯特拉斯。再次感谢你。