2010-01-01 3 views
2

DLL 전용 빌드에 대해 고유 한 플래그를 지정하는 방법은 무엇입니까? 기본적으로 libtool은 GNU 규칙을 따르는 대부분의 프로젝트에서 괜찮은 -DDLL_EXPORT을 추가합니다. 그러나 부스트를 사용하면 라이브러리 플래그를 지정해야 할 수도 있습니다. -DDLL_EXPORT -DBOOST_ALL_DYN_LINK DLL 만 빌드 할 때가 있습니다. 가끔은 조건부 빌드를 원하므로 DLL/SO 빌드에 대한 몇 가지 구체적인 정의가 필요합니다.DLL/SO 빌드에 특정 플래그/정의를 지정할 수 있습니까?

libtool을 사용하여 불행히도이를 수행 할 수있는 방법을 찾지 못했습니다. 어떤 플래그를 사용해야합니까?

P.S. .: CMake 로의 이동을 제안하지 마십시오.

예 :

내가 술집에 연결하고 동적 라이브러리에만 문자를 얻을 수 -DBAR_EXPORTS을 필요로 라이브러리 foo를 사용합니다.

libfoo_la_dynamic_CXXFLAGS = -DBAR_EXPORTS 

누구처럼 뭔가가 있나요?

대체 솔루션 : (아주 추악한)

다음 파일`defines.h

#if defined(PIC) || defined(DLL_EXPORT) 
#define BAR_EXPORTS 
#endif 

그리고 만들기 :

libfoo_la_CXXFLAGS += -include defines.h 

미운를하지만 작동합니다.

답변

0

당신은 다음 --enabled-shared과 함께 AM_CONDITIONAL를 사용하고 공유 라이브러리가 명시 적으로 요청되는 경우 별도의 정의를 설정할 수 있습니다

LT_INIT([disable-shared]) 

와 기본적으로 건물의 공유 라이브러리를 사용하지 않도록 설정할 수 있습니다. IOW, 정적 또는 공유는 가능하지만 두 가지를 동시에 사용할 수는 없습니다.

+0

다른 방법이 없습니까? – Artyom

+0

@Artyom 아마 있을지 모르지만 나는 그것을 모르고 있습니다. 유닉스에서만 Autotools를 사용하고 DLL을 빌드 할 때 Windows에서 사용하지 마십시오. – mloskot

0

귀엽지 만, conditional을 사용하여 DLL_EXPORT가 정의되어 있는지 확인하고 필요한 다른 프로그램을 정의했는지 확인할 수 있습니까?

나는 autotools가 좋지 않다. 나는 CMake를 선호하지만, 당신은 그렇게 생각하지 않는다.

+0

'am_conditional'은 프로젝트 전역이지만, 일반적으로 libtool로 빌드하면 정적 라이브러리와 공유 라이브러리를 모두 빌드합니다. 그래서 이것은 실제 해결책이 아닙니다. – Artyom