2010-12-04 5 views
12

소스 (의도적으로 구 버전 인 ./config && make && make test으로 작성)에서 OpenSSL을 빌드했으며 내 프로그램과 링크하려면 make install을 수행하지 않고 빌드 한 것을 사용하는 것이 좋습니다. 실패한 것OpenSSL 라이브러리를 프로그램에 연결

명령은 다음과 같습니다

gcc -Wall -Wextra -Werror -static -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto 
-Iopenssl/openssl-0.9.8k/include -o myApp source1.o source2.o common.o` 

그리고 유사한 오류 일련가 나타납니다

common.c:(.text+0x1ea): undefined reference to `SSL_write' 

이 내 OpenSSL을 펑키 뭔가가 있다고 생각하게합니다.

/usr/bin/ld: cannot find -lssl 
/usr/bin/ld: cannot find -lcrypto 

내가 잘못 OpenSSL을 컴파일하고 있습니까 : 내 명령에서 -Lopenssl/openssl-0.9.8k/를 생략하면 오류가없는 존재로 변경? 아니면이 문제를 어떻게 해결해야합니까?

답변

23

바보 같은 "Linux-isms"가 다시 공격합니다! 분명히, 내가 좋아하는 (man gcc을 나타 내기 위해 보이는에도 불구하고)이 -L-l 물건 말에서 것을 내 명령은 변경해야

gcc -Wall -Wextra -Werror -static -o myApp source1.o source2.o common.o -Lopenssl/openssl-0.9.8k/ -lssl -lcrypto -Iopenssl/openssl-0.9.8k/include

+15

마지막에 있어야하는'-lssl -lcrypto '입니다. 링커에서 라이브러리를 검색하면 이미 정의되지 않은 참조가있는 함수 만 링크됩니다. 따라서 링크 라인의 시작 부분에 "소비하는"객체를 놓고 끝에있는 객체를 "공급"해야합니다. – caf

+1

나는 내 자신의 대답을 받아들이는 것이 항상 이상하다. 나는 그것을 지금 바꿀 것이다. – mrduclaw

+0

clan llvm의 차이점은 무엇입니까? – saruftw

4

가 왜 make install을 사용하지 않으려는? 생성 된 바이너리를 이전에 가지고 있던 디렉토리에 복사 할 수 있습니다. ./configure --prefix $HOME/target_library_install_directory

빌드하고 설치하는 모든 라이브러리에이 트릭을 사용한 경우, L 옵션.

+0

이것은 알아두면 좋지만,'-L'을 두는 곳을 돌아 다니는 것보다 쉬울 지 확신하지 못합니다. 그럼에도 불구하고 선거에 투표했다. – mrduclaw

+0

나는 올바른 방법 일 가능성이 높기 때문에 이것을 앞으로 답으로 받아 들일 것입니다. 내 특별한 경우, 나는 내 코드 (그리고 수정 된 OpenSSL 코드)를 체크 아웃 한 모든 사람들이'make '를 제외한 모든 것을 수행하기를 원하지 않았다. – mrduclaw

1

Autotools를 사용하거나 cURL과 같은 Autools 프로젝트를 작성하는 경우 pkg-config을 사용할 수 있어야합니다. 아이디어는 Autotools 패키지가 OpenSSL의 패키지 구성을 읽게되고 모든 것이 "잘 작동 할 것"입니다.

OpenSSL 패키지 구성 라이브러리 이름은 openssl입니다.

makefile 기반 프로젝트 에서처럼 사용할 수 있습니다.

%.o: %.c 
     $(CC) -o [email protected] -c `pkg-config --cflags openssl` $^ 

target: foo.o bar.o baz.o 
     $(CC) -o [email protected] `pkg-config --libs openssl` $^ 

또한 How to use pkg-config in MakeHow to use pkg-config to link a library statically 참조하십시오.

+0

'pkg-config'에 대해이 답을 주셔서 감사합니다. 당신은 내가 5 살인 것처럼 설명 할 수 있습니까?'pkg-config'는 무엇이며 어떻게 작동합니까? 그것이 어떻게 자동으로 마술처럼 모든 링크가 dirs 등을 포함하는 것을 찾았는지 달성했다. 물론 나는 그것을 마술처럼 사용할 수 있지만 그것이 내부적으로 어떻게 작동 하는지를 알면 좋다. – barney

관련 문제