문제

편집하다: 나는 그것이 중요 할 경우를 명확히해야한다고 생각합니다. AIX UNIX 상자에 올라서 VAC 컴파일러를 사용하고 있습니다. GNU 컴파일러는 없습니다.최종 편집


나는 C/C ++에서 꽤 녹슬으므로 이것이 간단한 질문이라면 용서하십시오.

C 프로그램 중 일부에서 공통 기능을 수행하여 공유 라이브러리 또는 공유 객체에 넣고 싶습니다. PERL 에서이 작업을 수행한다면 SUBS를 PERL 모듈에 넣고 필요할 때 해당 모듈을 사용합니다.

예를 들어,이 기능이 있다고 가정 해 봅시다.

int giveInteger()
{
    return 1034;
}

분명히 이것은 실제 예제가 아니지만, 그 기능을 공유하고 싶다면 어떻게 진행합니까?

두 가지 옵션이 있다고 확신합니다.

  1. 내 공유 기능을 파일에 넣고 컴파일 시간에 메인 프로그램과 컴파일하도록하십시오. 공유 기능을 변경하면 메인 프로그램을 다시 컴파일해야합니다.
  2. 내 공유 기능을 파일에 넣고 공유 라이브러리로 컴파일하고 (내 용어가 올바른 경우) 해당 공유 라이브러리에 대한 메인 프로그램 링크가 있습니다. 공유 라이브러리에 대한 변경 사항 (컴파일 후)은 주 프로그램을 다시 컴파일하지 않고 런타임에서 메인 프로그램에 통합됩니다.

그 생각이 맞습니까?

그렇다면 어떻게 해당 메소드를 모두 불평 할 수 있습니까? 나는 많은 검색을했는데 다른 사람의 공유 라이브러리에 내 자신의 프로그램 링크를 어떻게 링크 할 수 있는지 정보를 찾는 것 같지만 내 자신의 공유 기능을 만들고 내 프로그램에서 사용할 수있는 방식으로 컴파일하는 방법은 아닙니다. .

정말 고마워!

브라이언


편집하다:

결론

도와 주셔서 감사합니다! 나는 다른 사람들이 혜택을 줄 수 있도록이 게시물 (AIX의 동적 공유 라이브러리를 위해)을 추가 할 것이라고 생각했습니다.

공유 기능을 컴파일합니다.

xlc -c sharedFunctions.c -o sharedFunctions.o

그런 다음 공유 객체로 만드십시오.

xlc -qmkshrobj -qexpfile=exportlist sharedFunctions.o
xlc -G -o libsharedFunctions.so sharedFunctions.o  -bE:exportlist

그런 다음 다른 프로그램을 연결합니다.

xlc -brtl -o mainProgram mainProgram.c  -L. -lsharedFunctions

그리고 또 다른 의견은이 링크를 찾는 데 도움이되었으며 다음과 같은 도움이되었습니다.http://publib.boulder.ibm.com/infocenter/comphelp/v7v91/topic/com.ibm.vacpp7a.doc/proguide/ref/compile_library.htm

나를 도와 준 모든 분들께 다시 한 번 감사드립니다!

도움이 되었습니까?

해결책

그래 당신은 맞습니다. 첫 번째는 a라고합니다 정적 라이브러리, 두 번째는 a라고합니다 공유 도서관, 코드는 컴파일 타임에 실행 파일에 바인딩되기 때문에 프로그램이로드되면 매번 다시.

정적 라이브러리

다음과 같이 라이브러리의 코드를 컴파일하십시오.

gcc -c *.c

그만큼 -c 프로그램에 객체 파일을 링크하지 말라고 말하지만 각각의 개체 파일로 남겨 둡니다. .c 컴파일 된 파일. 이제 하나의 정적 라이브러리로 보관하십시오.

ar rcs libmystuff.a *.o 

man ar RCS 옵션이 무엇을 의미하는지 알려줍니다. 이제 libmystuff.a는 a입니다 RCHIVE 파일 (Zip-File Viewers와 함께 열 수 있음)과 해당 객체 파일이 포함되어 있으며 각 객체 파일의 기호 색인이 포함되어 있습니다. 프로그램에 연결할 수 있습니다.

gcc *.c libmystuff.a -o myprogram

이제 귀하의 프로그램이 준비되었습니다. 정적 라이브러리가 명령 문제에 나타나는 순서에 유의하십시오. 내 참조 링크 순서 대답.

공유 도서관

공유 라이브러리의 경우 라이브러리를

gcc -shared -o libmystuff.so *.c

그게 다야, libmystuff. 그래서 이제 에스맹렬한 영형파일. 프로그램을 연결하려면 프로그램을 /etc/ld.so.conf 파일 또는 그에 의해 제공됩니다 -L GCC로 전환하거나 ld_library_path 변수에 나열되어 있습니다. 링크 할 때는 잘라냅니다 lib 접두사 및 .so GCC에 알려진 라이브러리 이름의 접미사.

gcc -L. -lmystuff *.c -o myprogram

내부적으로 GCC는 귀하의 주장을 GNU 링커에 전달합니다. 당신은 그것이 어떤 인수를 사용하여 통과하는지 볼 수 있습니다 -### 옵션 : GCC는 각 하위 프로세스에 제공된 정확한 인수를 인쇄합니다.

링크 프로세스에 대한 자세한 내용 (일부 작업이 내부적으로 수행되는 방법)은 내 Linux GCC 링커 대답.

다른 팁

세 번째 옵션이 있습니다. 일반적으로 C ++ 컴파일러는 C 루틴을 연결할 수 있어야합니다. 필요한 옵션은 컴파일러마다 다를 수 있으므로 미세한 M이지만 기본적으로 여기에서 g ++로 컴파일 할 수 있어야합니다.

$ g++ -o myapp myapp.cpp myfunc.c giveint.c

... 또는 별도로 컴파일하십시오

$ gcc -c myfunc.c
$ gcc -c giveint.c
$ g++ -c myapp.cpp
$ g++ -o myapp myapp.o myfunc.o

또한 기능 선언을 포함해야합니다. 당신은 c ++에서 그것을합니다

extern "C" {
    int myfunc(int,int);
    int giveInterger(void);
}

재 컴파일과 리 링킹을 구별해야합니다.

당신이 넣으면 giveInteger() 별도의 (아카이브) 라이브러리로 나중에 수정하면 소스 파일을 정의한 소스 파일을 다시 컴파일해야합니다. Relink 그것을 사용하는 모든 프로그램; 그러나 당신은 할 필요가 없습니다 다시 컴파일 그러한 프로그램 [1].

공유 라이브러리의 경우 라이브러리를 다시 컴파일하고 다시 링크해야합니다. 그러나이를 사용하는 프로그램을 다시 링크하거나 다시 컴파일 할 필요는 없습니다.

AIX에 C ++ 공유 라이브러리 구축은 복잡했습니다. Makec ++ sharedlib 쉘 스크립트를 사용해야했습니다. 그러나 VAC 5.0과 6.0을 사용하면 매우 쉬워졌습니다. 나는 당신이해야 할 일은 [2]입니다.

xlC -G -o shr.o giveInteger.cc
xlC -o myapp main.cc shr.o

1] 올바른 makefile (권장 연습)을 작성하면이 모든 것이 입력하면 자동으로 발생합니다. make.

2] 문제를 복잡하게 할 수있는 AIX의 특정 기능이 있습니다. 기본적으로 공유 라이브러리는 메모리에로드되고 후속 재부팅까지 "스틱"이 있습니다. 따라서 SHR.O를 재건하고 프로그램을 다시 실행하고 실행중인 라이브러리의 "오래된"버전을 관찰 할 수 있습니다. 이를 방지하기 위해 일반적인 관행은 SHR.O 세계를 읽을 수없는 것입니다.

chmod 0750 shr.o
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top