Directory 如何更改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构建的项目,但我想转向scons

但是,我无法链接SCON中的对象文件,所以我想知道如何更改SCON中的工作目录

我真正想要的是

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分享这两个。这是给斯特拉斯的,这是斯科斯和斯特拉斯。再次感谢你。