2014-07-14 2 views
2

을 하위 디렉터리에 링크 :SCons는이 같은 여러 서브 디렉토리 목표와 나는 SCons는 프로젝트가 라이브러리

project-root 
- SConstruct 
- Sconscript 
+ supportlib 
    - SConscript (returning library target) 
    + src 
     - ... 
+ Program 
    - SConsctipt (importing library target) 
    + src 
     - ... 

참고 : supportlib 공유 라이브러리입니다. 나는이 같은 supportlib 대상에 링크 하위 디렉터리 프로그램에서

:

Import([supportlib]) # returned from supportlib/Sconscript 
env.Append(LIBS=[supportlib]) 

이 작품의 supportlib 및 프로그램 컴파일 및 링크를 제공합니다. 그러나 supportlib가 프로그램에 링크되는 방법은 -lsupportlib 대신 공유 객체를 직접 참조하는 것입니다.

의사 링커 명령 예 :

SCons는이 같은 수행합니다

g++ -o Program/program src/sourcefile1.o src/sourcefile2.o -L ../supportlib -lsupportlib 

이유 :

g++ -o Program/program src/sourcefile1.o src/sourcefile2.o ../supportlib/libsupportlib.so 

내가이 원하는? 때문에 나는 다음과 같은 공유 라이브러리 의존성 얻을 연결하는 SCons는 방법과 :

$ ldd program/program 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f867ca03000) 
supportlib/libsupportlib.so 

내가 할 종속성을 원하는을 "경로가없는"이 같은 :

$ ldd program/program 
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f867ca03000) 
libsupportlib.so 

내가 꽤 방법이 목표를 달성 할 수 빌드 의존성을 깨뜨리지 않고 SCons로? 내 환경에서 LINKFLAGS를 사용하여 수동으로 수행 할 수 있다는 것을 알고 있지만이 방법도 플랫폼 간 호환이 아니며 LIBS에 전체 대상을 전달하지 않을 경우 SCons가 빌드 종속성에 대한 지식을 잃어 버리게 될 것이라고 추측합니다. supportlib와 프로그램 사이.

안부 야콥 사이먼 - Gaarde

답변

1

대상이 supportlib에 의해 반환되는/SConscript 라이브러리의 전체 프로젝트 상대 경로를 가지고있다. 그것이 SCons에서 목표물이 작동하는 방식입니다.

은 프로그램/SConscript에서 다음을 수행 할 수 있습니다, 당신이 요구하는지 무엇을 달성하기 위해, 그리고 SCons는 여전히 라이브러리에 종속 유지 :

env.Append(LIBS='supportlib') 
env.Append(LIBPATH='#supportlib') 
env.Program(source='main_src_files', target='main') # will link with supportlib 

공지 사항을 그 SCons는 수단에서 '#'문자 (SConstruct 빌드 스크립트가있는) 프로젝트 루트 디렉토리를 기준으로합니다.

SConstruct에서 만든 env에 라이브러리 이름을 설정하고 해당 env를 subdir SConscript 빌드로 전달하면 좀 더 멋지게 만들 수 있습니다 스크립트는 다음과 같습니다.

SConstruct :

env = Environment() 
... 
SConscript('supportlib/SConscript', exports=['env']) 
SConscript('Program/SConscript', exports=['env']) 

supportlib/SConscript :

Import('env') 
... 
env['supportlib_name'] = 'supportlib' 
env.SharedLibrary(source='source_files', target=env['supportlib_name']) 

프로그램/SConscript :

Import('env') 
... 
clonedEnv = env.clone() 
clonedEnv.Append(LIBS=env['supportlib_name']) 
env.Append(LIBPATH='#supportlib') 
clonedEnv.Program(source='main_src_files', target='main') 

귀하의 상황에 따라, 당신은 당신이 libs와 설정 곳 ENV를 복제 할 수 있습니다 및 라이브러리 경로 그래서 당신은 프로젝트의 나머지 부분에 대한 환경 오염을하지 마십시오. 내 경험에

0

, 다음은 예를 들어 작동합니다 : 이것은 표준 검색 경로에 추가 ("supportlib"상대 경로에 libsupportlib.so를 찾기 위해 링커를 말하는 -Lsupportlib -lsupportlib가 발생합니다

env.Append(LIBPATH='supportlib') # assuming this is a subdirectory from top 
env.Append(LIBS=[os.path.basename(str(supportlib))]) # to only pick lib soname. (You may need to do [0] there too) 

). 그렇게하면 라이브러리 소네트 만 포함됩니다.

그러나 이것이 비표준 라이브러리 이름 (비 - soname)에서 작동하지 않는다는 것을 발견했습니다. 이는 해결하려는 문제입니다.

0

@brady 맞습니까?

환경을 복제해야하는 필요성을 없애주는 약간 자세한 방법이 있습니다() (동일한 방법으로 전체 프로그램을 연결하지 않는 한이 방법을 사용하는 것이 좋습니다. LIBPATH 및/또는 LIBS)

env.Program(source='main_src_files', target='main',LIBS='supportlib',LIBPATH='#supportlib') # will link with supportlib 
관련 문제