链接器无法从scons找到不同目录中的对象文件 [英] linker could not found object files from different directory with scons

查看:795
本文介绍了链接器无法从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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆