sub1.c sub2.cからlibsub1.so libsub2.soを作成し、main.cをコンパイルします。
いずれのファイルも/rootにあります。
ここで
gcc -c sub1.c
gcc -shared -o libsub1.so sub1.o
gcc -c sub2.c
gcc -shared -o libsub2.so sub2.o
gcc -o main main.c libsub1.so libsub2.so
だけでは
[root@localhost ~]# ldd main
linux-gate.so.1 => (0x0020d000)
libsub1.so.1 => not found
libsub2.so.1 => not found
libc.so.6 => /lib/libc.so.6 (0x003e3000)
/lib/ld-linux.so.2 (0x003c4000)
でロードされていないので
ln -s /root/libsub1.so /usr/lib/libsub1.so
ln -s /root/libsub2.so /usr/lib/libsub2.so
で/usr/libにシンボリックリンクを張る必要があります。
このリンクをはる作業をなんとかしてコンパイラのオプションを用いて省略したいとおもっています。
そこで
gcc -o main main.c -L/root/libsub1.so -L/root/libsub2.so
としたのですが
/tmp/cc4Ccfom.o: In function `main':
main.c:(.text+0x12): undefined reference to `print'
collect2: ld はステータス 1 で終了しました
make: *** [main] エラー 1
になってしまいました。
上の状況で質問は2つあります。
(1)gccのオプションを用いてシンボリックリンクを張る作業を省略するにはどうすればいいでしょうか?(私はーLの使い方を見よう見まねで用いたのですがまずかったようでエラーがでました。)
(2)上のエラーは何が原因だったのでしょうか?
ソースは
//sub1.c
#include "sub.h"
int TEST=10;
//sub2.c
#include "sub.h"
#include <stdio.h>
void print(void)
{
if(TEST)
printf("TEST is HOGE!\n");
}
//main.c
#include "sub.h"
#include <stdio.h>
int main(void)
{
print();
return 0;
}
//sub.h
extern int TEST;
です。
どちらかでも回答できるかたがいらっしゃれば、お願いします。
No.3ベストアンサー
- 回答日時:
ライブラリの探索パスは、コンパイル時と実行時で違うからです。
-Lはあくまでコンパイル時の探索パスを指定するオプションです。
実行時の探索パスを設定する場合は-Wl,-rpathを使用します。
gcc -o main main.c -L/root/libsub1.so -L/root/libsub2.so -Wl,-rpath,/root
-Wl,-rpathを設定せずにコンパイルされた実行ファイル(main)をとりあえず動かすには、
export LD_LIBRARY_PATH=/root
としてから、lddすれば「not found」は無くなり、実行もできるはずです。
他にも、ld.so.confに/rootを追加してldconfigコマンドを実行する方法もあるのですが、
テスト目的以外ではお勧めしません。
詳細はNo.1様が張られたリンク先を参照されるのがよいと思います。
No.2
- 回答日時:
マニュアルを読んで -L の意味が分かれば疑問は氷解するはず.
No.1
- 回答日時:
-Lついては
http://oshiete.goo.ne.jp/qa/2006656.html
のANo.2を参照。
上記の回答にもあるが、-Lだけでは、実行時にlibsub1.so、libsub2.soを探せずにエラーになるので、ANo.2の「4つの方法」のどれか1つを用いて解決する事。
あと、main関数でprint()を呼び出す前に
void print(void);
と、関数プロトタイプ宣言をしておく事。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- C言語・C++・C# 質問です 下記のコードを分かりやすく解説お願いします 初心者です #include ‹stdio.h 3 2022/05/26 22:03
- PHP htmlspecialcharsが機能していないです。 バグですか? 1 2022/04/05 01:22
- その他(プログラミング・Web制作) python 2 2022/12/23 09:06
- その他(プログラミング・Web制作) python flask から fastapiへの移行時のエラー対処 1 2023/02/05 12:26
- C言語・C++・C# C言語で再起関数とポインタを用いて文字列反転をする方法がわかりません。 4 2023/04/29 20:32
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# スタックフレームの消滅 6 2023/05/20 12:33
- UNIX・Linux linuxサーバーのキャッシュをクリアするコマンドを実行したい。 5 2023/01/24 14:52
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
operator new が再定義されてい...
-
Borlandbcc55とMYSQLのコ...
-
visual studio community2017 O...
-
DirextXエラー:ファイル'dxerr9...
-
共有ライブラリ作成時の -L
-
VC++でビルド時の、リンク警告 ...
-
C++Builder リンカエラーとは?
-
インポートライブラリ(.lib)フ...
-
リンカにmsimg32.libをインポー...
-
GDLの設定
-
BCCでコンパイルする際に静的リ...
-
Visual Studio .NET (C++) は今...
-
namespace名前空間をヘッダファ...
-
'd3dx9.lib' が開けません。
-
MP3の再生
-
スタティックライブラリの使い方
-
#include <winreg.h>をインクル...
-
Visual StadioでLeapMotionの開...
-
eclipse+MinGWの環境で外部ライ...
-
コンパイルはできるが、リンク...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
スタティックライブラリ関係の...
-
スタティックリンクライブラリ...
-
fatal error LNK1104: ファイル...
-
VC++6.0からVC++.NET2005へ移植
-
error LNK2001: 外部シンボル "...
-
C++Builder リンカエラーとは?
-
#include <winreg.h>をインクル...
-
タイプライブラリのレジストリ...
-
【VS2008 C++】2つのプロジェ...
-
#pragma commentの相対パス指定
-
'd3dx9.lib' が開けません。
-
'stdafx.h'のエラーに関して
-
VC++でビルド時の、リンク警告 ...
-
「MFCを使用しない」から「MFC...
-
error LNK2019: 未解決の外部シ...
-
静的/動的リンクライブラリにつ...
-
MP3の再生
-
dllかlibか
-
C++によるPostgreSQLの接続
-
visual studio community2017 O...
おすすめ情報