C/C++의 기본적인 문제점은 라이브러리 컴파일 영역에 있습니다. 예. 소프트웨어 A는 라이브러리 Z를 사용하므로 소프트웨어 Z를 컴파일하고 사용하거나 소프트웨어 A를 개발하기 전에 라이브러리 Z를 컴파일해야합니다.라이브러리 컴파일을위한 C/C++ 협약/툴체인
많은 경우에 프로젝트를 구성한 다음 make + make install을 호출하는 개념이 있습니다. 예 : 당신은 당신의 명령 줄을 열고 다음을 입력 :
./configure
make
make install
./configure
프로젝트의 최상위 디렉토리에있는 쉘 스크립트입니다. 모든 종속성이 시스템에 있는지 확인하고 이러한 종속성에 대한 경로를 저장한다고 가정합니다. 나중에 make는 수집 된 정보를 사용하여 컴파일러에 각각의 포함 경로와 라이브러리 위치 (예 : .so/.a 파일의 위치)를 제공 할 수 있습니다.
make
은 I-dont-know에 의해 생성되고 XYZ 형식을 갖는 makefile에 의해 지정된대로 올바른 순서로 소스 파일을 컴파일하고 링크합니다. 물론, 컴파일/링크 자체가 아니라 실제 컴파일러와 링커를 호출하여 작업을 수행합니다.
make install
은 결과 바이너리 파일을 가져 와서 시스템의 어딘가에 배치합니다 (예 : 프로젝트가 라이브러리 인 경우/usr/lib 또는 실행 파일의 경우/usr/bin). 현재 사용중인 프로젝트가 라이브러리 인 경우, 라이브러리의 헤더 파일을 가져 와서 시스템의 어딘가에 설치합니다.
이것은 비교적 복잡한 프로세스입니다. CMI를 사용하여 이러한 유형의 컴파일 프로세스를 나타냅니다 (CMI = configure-make-install). 또한, CMI 개념은 - 내가 알 수있는 한, 리눅스 세계에 특화된 개념이다. Windows 에서처럼 작동하지 않습니다 (예 : ./configure를 실행하는 데 사용할 수있는 셸이 없기 때문입니다. make는 심지어 gcc/g ++로 제한 될 수도 있지만, 그런 경우인지는 알 수 없습니다.
가장 중요하게는, 나는 어디에서 그걸 볼지조차 모릅니다. 또한 CMI 개념이 동시에 여러 버전의 라이브러리를 설치할 수 있는지 여부를 조사하고 싶습니다. 당신은 소프트웨어 B와 소프트웨어 C의 개발자라고 상상해보십시오. 소프트웨어 B와 C는 둘 다 라이브러리 Y에 의존하지만, B는 Y 1.0.x가 필요하고 C는 1.1.x가 필요합니다. make install이 라이브러리의 헤더 파일을 시스템의 어딘가에 배치하면 충돌이 발생하지 않습니까? 다시, 나는 내 자신에게 묻습니다. 어디서 볼 수 있습니까?
예제 라이브러리에 대해 설명해 드리겠습니다. libzip. 홈페이지에는 지원되거나 권장되는 컴파일러 또는 플랫폼이 명시되어 있지 않습니다. 지금 어떻게 하시겠습니까?
흥미롭게도 페이지는 MySQL Workbench가 libzip을 사용한다고 주장합니다. MySQL Workbench도 Windows 용으로 제공되므로 libzip을 Windows에서 컴파일 할 수 있다고 가정합니다.
나는 또한 그 libzip 관찰은 CMakeLists.txt및구성 스크립트와 함께 제공됩니다. 심지어 libya.pc.in CMake-template이 있는데, pkg-config 도구입니다. 또한 Makefile.am (그게 뭐든간에)과 Makefile.in (아마도 다른 CMake 템플릿)이 있습니다. 마지막으로 중요한 것은 m4 및 .m4 파일 (m4 폴더와 프로젝트의 루트 폴더 모두)에 폴더 m4와 .m4 파일이 있음을 알았습니다. 그러나 cmake-config.h.in, cmake-zipconf.h.in을 잊지 마십시오.(? 오른쪽)
- 적용하지 CMI 개념을 사용
- : 당신이 libzip을 컴파일하려면
그래서, 다음과 같은 대안을 고려해야합니다 어떤 종류의 컴파일러/IDE CMake를 생성할지 결정해야만하는 CMake, 어떤 종류의 메타 빌드 시스템 인
- : gcc? MSVC? Mingw 또는 QTSDK/MingW?
어쩌면 그
M4는 GNU autoconf를 관련이있을 것으로 보인다 무엇이든 M4를 사용 (어떤 차이입니다). 나는 또한 위 목록에 추가 할 수 있다고 생각합니다.
((!) 참고가 :. 지금까지, 나는 현재 내가 컴파일 오류가 모든 종류의를 고정하고 비주얼 CMake + 스튜디오 2010의 조합을 사용하여 libzip 컴파일 시도)
이 내 중앙 관측이다 :
libzip은 간단한 라이브러리입니다. 그냥 지퍼 물건. 그러나 편집 작업에는 많은 도구가 필요하기 때문에 고급 프로그래머에게조차도 매우 어려운 작업입니다.
또한 대부분의 도구에 대한 설명서가 부족합니다 (그렇지 않은 이유는 무엇입니까? 대답을 찾을 수있는 위치를 모르는 이유는 무엇입니까?). 예를 들어 버그 수정 CMake FindPackage-scripts 한숨과 같은 리버스 엔지니어링에 시간을 투자하지 않고도 대부분의 도구가 작동하지 않습니다.
나는 그 것처럼 계속 될 수 있습니다. 나는 수많은 컴파일 개념에서 길을 잃었다. 모두 이 서로 관련이있다., 어떤 플랫폼과 컴파일러가 잘 작동하는지 등등.
또 다른 예 : RetroShare. Windows is documented의 컴파일 프로세스에도 컴파일을 수행하는 것은 매우 어렵습니다. Windows에서의 RetroShare 컴파일에는 QtSDK/MingW, Cygwin 및 MingW/MSYS가 포함되어 있습니다. 이들 모두는 서로 다른 부품/종속성에 대한 것입니다. 이 도구들은 어떻게 함께 작동합니까?
나는 완전히 잃어 버렸고 이런 종류의 문제를 다루는 방법과 이러한 모든 도구/툴체인/컴파일러/플랫폼을 고려한 심각한 피해로부터 당신을 보호하는 방법을 알려주시겠습니까?
나는 매우 지능이 있습니까? 아니면 매우 바보입니까? 왜 이렇게 복잡합니까 (아니면 그렇지 않은가)?
- : 당신이 libzip을 컴파일하려면
안녕하세요 로버트 클럽에 오신 것을 환영합니다. :) – Irfy
'./configure;를 실행하는 방법; 하다; 설치'를 엄청나게 어려운 작업으로 만드시겠습니까? 라이브러리 코더는 이와 같은 autotools를 사용하므로 라이브러리의 복잡한 종속성에 대해 알 필요없이 여러 다양한 OS에서 실행할 수 있습니다. –
팁 : 소개하는 것을 피하십시오. 질문의 첫 번째 몇 줄만 질문 페이지에 나타나기 때문에 질문에 중요하다고 생각하고 처음에는 질문을하지 말고 더 많은주의를 기울일 가능성이 더 큽니다. 카운트! – amit