2013-11-22 8 views
4

나는 특히 libtool과 같은 GNU autotools와는 관계가 어렵다. 하지만 그들은 이식성과 크로스 컴파일에 관해서 엉덩이를 걷어차 기 때문에 다시 사용하기 시작했습니다.libtool 및 Windows DLL

불행히도 libtool에 적절한 Windows DLL을 구축 할 수 없습니다. 그러나 바닐라와 함께 gcc 은 나를 위해 행복하게 DLL을 만들 것입니다. 예를 들어

: haily DLL을 가져올 라이브러리를 구축 할 것입니다

LIBEXT = .dll 

pkzo$(LIBEXT): $(patsubst %.cpp, %.o, $(pkzo_SOURCES)) resources.o 
    $(CXX) -shared -fPIC $(CXXFLAGS) $^ $(LDFLAGS) -Wl,--out-implib=libpkzo.lib -o [email protected] 

. (심지어 성가신 decelspec없이).

그러나 나는 그렇게 같이 libtool을 사용하는 경우 : Libtool의 불평 온다

lib_LTLIBRARIES = libpkzo.la 

libpkzo_la_CXXFALGS = ... 
libpkzo_la_LDADD = ... 
libpkzo_la_SOURCES = ... 

:

*** Warning: linker path does not have real file for library -lSDL2main. 
*** I have the capability to make that library automatically link in when 
*** you link to this library. But I can only do this if you have a 
*** shared version of the library, which you do not appear to have 
*** because I did check the linker path looking for a file starting 
*** with libSDL2main and none of the candidates passed a file format test 
*** using a file magic. Last file checked: /usr/local/lib/libSDL2main.a 

*** Since this library must not contain undefined symbols, 
*** because either the platform does not support them or 
*** it was explicitly requested with -no-undefined, 
*** libtool will only create a static version of it. 

이 잘 libSDL2main.a 정적 라이브러리와 어떤 DLL이없는 것 같아요.

거기에 libtool을 사용하지 않는 automake로 DLL을 빌드하거나 libtool에 아무런 소동을하지 말라고 말하는 방법이 있습니까?

PS : 사람이 그것을 언급하기 전에, 내가 첫 번째 문제를 들어 LT_INIT([shared static win32-dll])

+0

Fedora에서 Quake 복제본을 크로스 컴파일하려고하는 것과 똑같은 문제가 있습니다. 당신이 정한 해결책 아래 upvoted 대답 했습니까? – jdolan

+0

그래서 .. 재미있는 이야기. 몇 시간과이 문제로 골치 아픈 시간을 보낸 후 방금 SDL, SDL_image 및 SDL_ttf 파일을 설치 한 바보 같은 libSDL * .la libtool을 삭제했습니다. 그리고 갑자기 모든 것이 행복하게 다시 연결됩니다. 고마워, libtool. 정말. 잘 했어. – jdolan

답변

1

와 libtool을 구성하고, 설치 한 SDL 라이브러리의 공유 버전이 있는지 확인하십시오.

절대적으로 DLL을 정적 라이브러리에 연결해야한다면 libtool을 편집하여 libtool을 속일 수 있습니다. 당신이 정적 DLL에 링크 된 종속 libs와의 모든을 원하는 경우 예는, 당신은에 의해 [당신의 configure.ac의 끝이 utting 것을 할 수있다 : 이제

sed -i '/^whole_archive_flag_spec=/s/"$/ \\${wl}-static"/' libtool 

,이 심한 해킹이며, libtool이 명령 행을 빌드하는 특별한 방법에 의존하므로, 그것이 계속 작동한다는 보장은 없지만 libtool 2.4.2에서 작동합니다. 정적으로 연결된 라이브러리가 하나뿐이므로 sed를 약간 다르게 적용하면됩니다. 아마 당신은 당신이 어떤 다른 공유 libs와 함께 링크 공유 유지하기 위해

sed -i '/^whole_archive_flag_spec=/s/"$/ \\${wl}-static \\${wl}-lSDL2main \\${wl}-shared"/' libtool 

을 할 것입니다, 그리고 당신은 당신이 그것을 가지고 어디든지 다른 사람에서 -lSDL2main을해야합니다. 이것은 gimpy이지만, 당신이하려고하는 것은 또한 gimpy이며 libtool은 이것을 위해 만들어지지 않았습니다.

두 번째 문제의 경우 -no-undefinedlibpkzo_la_LDFLAGS을 추가하십시오.

+0

불행히도 SDL에 대해 알지 못합니다. SDL2main.a는 응용 프로그램의 메인을 제공하므로 공유 라이브러리가 될 수 없습니다. 이것은 의도적으로 약간 성가신 일입니다. – rioki

+0

그러면 자신의'main()'을 사용하여 빌드 할 수 있습니까? – uckelman

+0

예, 아니오, 어쩌면 ...SDL2main 라이브러리의 멋진 점은 Windows 환경에서 "정상적인"주요 기능으로 장애없이 작업 할 수 있다는 점입니다. (SDL은 그래픽 응용 프로그램에서 필요한 WinMain으로 설정을합니다.) – rioki