GNU/Linux >> Belajar Linux >  >> Linux

Belajar mengkompilasi sesuatu dari sumber (di Unix/Linux/OSX)

Solusi 1:

Saya minta maaf karena langsung menjawab semuanya, tapi saya tidak tahu tutorial yang berguna, FAQ, dll. Pada dasarnya yang berikut adalah 8 tahun membuat aplikasi desktop (yang saya bantu distribusikan), frustrasi dan googling:

1. Bagaimana cara mengetahui argumen apa yang harus diteruskan ke ./configure?

Berlatihlah dengan sungguh-sungguh. Autotools cukup mudah karena konsisten. Tapi ada banyak hal di luar sana yang menggunakan cmake, atau skrip pembuatan khusus. Secara umum, Anda tidak perlu melewati apa pun untuk dikonfigurasi, ini harus mengetahui apakah sistem Anda dapat membuat foo-tool atau tidak.

Alat konfigurasi dan GNU semuanya mencari di /, /usr dan /usr/local untuk dependensi. Jika Anda menginstal apa pun di tempat lain (yang membuat hal-hal menyakitkan jika dependensi diinstal oleh MacPorts atau Fink), Anda harus memberikan tanda untuk mengonfigurasi atau memodifikasi lingkungan shell untuk membantu alat GNU menemukan dependensi ini.

2. Cara kerja pustaka bersama di OS X / Linux - di mana mereka berada di sistem file, bagaimana ./configure &&make menemukannya, apa yang sebenarnya terjadi ketika mereka ditautkan

Di Linux mereka harus diinstal ke jalur yang dapat ditemukan oleh tautan dinamis, ini ditentukan oleh LD_LIBRARY_PATH variabel lingkungan dan isi dari /etc/ld.conf. Di Mac hampir selalu sama untuk sebagian besar perangkat lunak sumber terbuka (kecuali jika itu adalah Proyek Xcode). Kecuali variabel env adalah DYLD_LIBRARY_PATH sebagai gantinya.

Ada jalur default yang dicari tautan untuk perpustakaan. Ini adalah /lib:/usr/lib:/usr/local/lib

Anda dapat melengkapi ini dengan menggunakan variabel CPATH, atau CFLAGS atau sejumlah variabel lingkungan lainnya (sangat rumit). Saya menyarankan CFLAGS seperti ini:

ekspor CFLAGS="$CFLAGS -L/baru/jalur"

Parameter -L menambah jalur tautan.

Hal-hal modern menggunakan alat pkg-config. Hal-hal modern yang Anda instal juga menginstal file .pc yang menjelaskan pustaka dan di mana letaknya serta cara menautkannya. Ini bisa membuat hidup lebih mudah. Tapi itu tidak datang dengan OS X 10.5 jadi Anda harus menginstalnya juga. Juga banyak dep dasar yang tidak mendukungnya.

Tindakan menautkan hanyalah "selesaikan fungsi ini saat runtime", ini benar-benar tabel string yang besar.

3. Apa perbedaan sebenarnya antara perpustakaan bersama dan perpustakaan yang terhubung secara statis? Mengapa saya tidak bisa menautkan semuanya secara statis saja (RAM dan ruang disk murah hari ini) dan karenanya menghindari konflik versi perpustakaan yang aneh?

Saat Anda menautkan ke file pustaka statis, kode tersebut menjadi bagian dari aplikasi Anda. Ini akan seperti jika ada satu file .c raksasa untuk perpustakaan itu dan Anda mengompilasinya ke dalam aplikasi Anda.

Pustaka dinamis memiliki kode yang sama, tetapi saat aplikasi dijalankan, kode tersebut dimuat ke dalam aplikasi pada waktu proses (penjelasan yang disederhanakan).

Anda dapat menautkan secara statis ke semuanya, namun sayangnya, hampir tidak ada sistem build yang membuatnya mudah. Anda harus mengedit file sistem build secara manual (mis. Makefile.am, atau CMakeLists.txt). Namun, hal ini mungkin perlu dipelajari jika Anda menginstal hal-hal yang memerlukan versi pustaka yang berbeda secara rutin dan Anda merasa kesulitan menginstal dependensi secara paralel.

Caranya adalah dengan mengubah baris tautan dari -lfoo menjadi -l/path/to/static/foo.a

Anda mungkin dapat menemukan dan mengganti. Setelah itu periksa alat tidak tertaut ke .so atau dylib menggunakan ldd foo atau otool -L foo

Masalah lainnya adalah tidak semua pustaka dikompilasi ke pustaka statis. Banyak yang melakukannya. Tapi kemudian MacPorts atau Debian mungkin memutuskan untuk tidak mengirimkannya.

4. Bagaimana cara mengetahui pustaka apa yang telah saya pasang, dan versi apa?

Jika Anda memiliki file pkg-config untuk pustaka tersebut, caranya mudah:

pkg-config --daftar-semua

Kalau tidak, Anda sering tidak bisa dengan mudah. Dylib mungkin memiliki soname (mis. foo.0.1.dylib, soname 0.1) yang sama dengan versi perpustakaan. Namun ini tidak diperlukan. Soname adalah fitur komputasi biner, Anda harus mengganti sebagian besar soname jika Anda mengubah format fungsi di perpustakaan. Jadi Anda bisa mendapatkan misalnya. soname versi 14.0.5 untuk pustaka 2.0. Meskipun ini tidak umum.

Saya merasa frustrasi dengan hal semacam ini dan telah mengembangkan solusi untuk ini di Mac, dan saya akan membicarakannya selanjutnya.

5. Bagaimana cara menginstal lebih dari satu versi pustaka tanpa merusak sistem normal saya?

Solusi saya untuk ini ada di sini:http://github.com/mxcl/homebrew/

Saya suka menginstal dari sumber, dan menginginkan alat yang membuatnya mudah, tetapi dengan beberapa manajemen paket. Jadi dengan Homebrew saya membangun, misalnya. wget sendiri dari sumber, tetapi pastikan untuk menginstal ke awalan khusus:

/usr/local/Cellar/wget/1.1.4

Saya kemudian menggunakan alat homebrew untuk menyinkronkan semua itu ke /usr/local, jadi saya masih memiliki /usr/local/bin/wget dan /usr/local/lib/libwget.dylib

Nanti jika saya memerlukan versi wget yang berbeda, saya dapat menginstalnya secara paralel dan hanya mengubah versi yang ditautkan ke pohon /usr/local.

6. Jika saya menginstal sesuatu dari sumber pada sistem yang sebaliknya dikelola menggunakan paket, apa cara terbersih untuk melakukannya?

Saya yakin cara Homebrew paling bersih, jadi gunakan atau lakukan hal yang setara. Instal ke /usr/local/pkgs/name/version dan symlink atau hard link sisanya masuk.

Gunakan /usr/local. Setiap alat build yang ada mencari dependensi dan header di sana. Hidup Anda akan banyak lebih mudah.

7. Dengan asumsi saya berhasil mengkompilasi sesuatu secara fiddly dari sumber, bagaimana saya bisa mengemasnya sehingga orang lain tidak harus melewati rintangan yang sama? Terutama pada OS X....

Jika tidak memiliki dependensi, Anda dapat memasang direktori build dan memberikannya kepada orang lain yang kemudian dapat melakukan "make install". Namun Anda hanya dapat melakukan ini dengan andal untuk versi OS X yang sama persis. Di Linux, ini mungkin akan berfungsi untuk Linux yang serupa (mis. Ubuntu) dengan versi Kernel dan versi minor libc yang sama.

Alasan tidak mudahnya mendistribusikan binari di Unix adalah karena kompatibilitas binari. Orang-orang GNU, dan orang lain sering mengubah antarmuka biner mereka.

Pada dasarnya jangan mendistribusikan binari. Hal-hal mungkin akan pecah dengan cara yang sangat aneh.

Di Mac, opsi terbaik adalah membuat paket macports. Semua orang menggunakan macports. Di Linux ada begitu banyak sistem dan kombinasi build yang berbeda, menurut saya tidak ada saran yang lebih baik daripada menulis entri blog tentang bagaimana Anda berhasil membuat alat x dalam konfigurasi yang aneh.

Jika Anda membuat deskripsi paket (untuk macports atau homebrew) maka siapa pun dapat menginstal paket itu, dan ini juga menyelesaikan masalah ketergantungan. Namun ini seringkali tidak mudah, dan juga tidak mudah untuk memasukkan resep macports Anda ke dalam pohon macports utama. Juga macports tidak mendukung jenis instalasi eksotis, mereka menawarkan satu pilihan untuk semua paket.

Salah satu tujuan masa depan saya dengan Homebrew adalah untuk memungkinkan mengklik tautan di situs web (mis. homebrew://blah dan itu akan mengunduh skrip Ruby itu, menginstal deps untuk paket itu dan kemudian membangun aplikasinya. Tapi ya, belum selesai, tapi tidak terlalu rumit mengingat desain yang saya pilih.

8. Apa alat baris perintah yang perlu saya kuasai untuk menguasai hal ini? Hal-hal seperti otool, pkg-config dll.

otool benar-benar hanya berguna setelahnya. Ini memberi tahu Anda apa yang dibangun tautan biner. Saat Anda mencari tahu ketergantungan alat yang harus Anda buat, itu tidak berguna. Hal yang sama berlaku untuk pkg-config karena Anda sudah menginstal dependensi sebelum dapat menggunakannya.

Rantai alat saya adalah, baca file README dan INSTALL, dan lakukan configure --help. Perhatikan output build untuk memeriksa apakah itu waras. Parsing kesalahan build apa pun. Mungkin di masa mendatang, tanyakan di serverfault :)

Solusi 2:

Ini adalah topik yang sangat besar jadi mari kita mulai dengan pustaka bersama di Linux (ELF di Linux dan Mach-O di OS X), Ulrich Drepper memiliki pengantar yang bagus untuk menulis DSO (objek bersama dinamis) yang mencakup beberapa riwayat pustaka bersama di Linux yang tersedia di sini termasuk mengapa mereka penting

Ulrich juga menjelaskan mengapa penautan statis dianggap berbahaya, salah satu poin utama di sini adalah pembaruan keamanan. Buffer overflow di perpustakaan umum (misalnya zlib) yang ditautkan secara ekstensif secara statis dapat menyebabkan overhead yang sangat besar untuk distribusi - ini terjadi dengan zlib 1.1.3 (penasihat Red Hat)

ELF

Halaman manual linker ld.so

man ld.so 

menjelaskan jalur dasar dan file yang terlibat dalam penautan dinamis runtime. Pada sistem Linux modern, Anda akan melihat jalur tambahan yang ditambahkan melalui /etc/ld.so.conf.d/ biasanya ditambahkan melalui glob yang disertakan di /etc/ld.so.conf.

Jika Anda ingin melihat apa yang tersedia secara dinamis melalui konfigurasi ld.so, Anda dapat menjalankannya

ldconfig -v -N -X

Membaca panduan DSO seharusnya memberi Anda tingkat pengetahuan dasar yang baik untuk kemudian memahami bagaimana prinsip-prinsip tersebut berlaku untuk Mach-O di OS X.

Mach-O

Pada OS X format binernya adalah Mach-O. Dokumentasi sistem lokal untuk linker adalah

man dyld

Dokumentasi format Mach tersedia dari Apple

Alat pembuatan UNIX

configure umum , make , make install proses umumnya disediakan oleh autotool GNU yang memiliki buku online yang mencakup beberapa sejarah konfigurasi/pembagian build dan rantai alat GNU. Autoconf menggunakan pengujian untuk menentukan ketersediaan fitur pada sistem build target, menggunakan bahasa makro M4 untuk menjalankannya. Automake pada dasarnya adalah metode templating untuk Makefiles, templat umumnya disebut Makefile.am yang menghasilkan Makefile.di mana keluaran autoconf (skrip konfigurasi) diubah menjadi Makefile.

Program halo GNU bertindak sebagai contoh yang baik untuk memahami rantai alat GNU - dan manualnya menyertakan dokumentasi alat otomatis.

Solusi 3:

Simon! Saya tahu bagaimana perasaan Anda; Saya juga kesulitan dengan bagian pembelajaran Linux ini. Berdasarkan pengalaman saya sendiri, saya menulis tutorial tentang beberapa item yang Anda bahas (sebagian besar sebagai referensi untuk saya sendiri!):http://easyaspy.blogspot.com/2008/12/buildinginstalling-application-from.html. Saya pikir Anda akan menghargai catatan saya tentang betapa sederhananya aplikasi Python untuk dibuat/diinstal. :)

Semoga ini bisa membantu! Dan selamat menyusun.

Tim Jones

Membangun/Memasang aplikasi dari sumber di Ubuntu Linux

Sementara repositori Ubuntu penuh dengan aplikasi hebat, pada satu waktu atau yang lain Anda pasti akan menemukan alat "must-have" yang tidak ada dalam repositori (atau tidak memiliki paket Debian) atau Anda memerlukan versi yang lebih baru daripada di repositori. Apa pekerjaanmu? Nah, Anda harus membangun aplikasi dari sumber! Jangan khawatir, ini sebenarnya tidak serumit kedengarannya. Berikut adalah beberapa tips, berdasarkan pengalaman saya menjadi amatir peringkat! (Sementara saya menggunakan Ubuntu untuk contoh ini, konsep umum harus berlaku untuk hampir semua distribusi Unix/Linux, seperti Fedora, dan bahkan platform Cygwin di Windows.)

Proses dasar membangun (kompilasi) sebagian besar aplikasi dari sumber mengikuti urutan ini:configure --> compile --> install. Perintah khas Unix/Linux untuk melakukan hal ini adalah:config --> make --> make install . Dalam beberapa kasus, Anda bahkan akan menemukan laman web yang menunjukkan bahwa semua ini dapat digabungkan menjadi satu perintah:

$ config && make && make install

Tentu saja, perintah ini mengasumsikan bahwa tidak ada masalah dalam langkah-langkah ini. Di sinilah kesenangan datang!

Memulai

Jika Anda belum pernah mengompilasi aplikasi dari sumber di sistem Anda sebelumnya, Anda mungkin perlu menyiapkannya dengan beberapa alat pengembangan umum, seperti gcc suite kompiler, beberapa file header umum (anggap ini sebagai kode yang telah ditulis oleh orang lain yang digunakan oleh program yang Anda instal), dan alat make. Untungnya, di Ubuntu, ada metapackage bernama build-essential yang akan menginstal ini. Untuk menginstalnya (atau pastikan Anda sudah memilikinya!), jalankan perintah ini di terminal:

$ sudo apt-get install build-essential

Sekarang setelah Anda memiliki penyiapan dasar, unduh file sumber aplikasi dan simpan ke direktori tempat Anda memiliki izin baca/tulis, seperti direktori "rumah" Anda. Biasanya, ini akan berada dalam file arsip dengan ekstensi file .tar.gz atau .tar.bz2 . .tar hanya berarti bahwa itu adalah "arsip kaset", yang merupakan pengelompokan file yang mempertahankan struktur direktori relatifnya. .gz singkatan dari gzip (GNU zip), yang merupakan format kompresi Unix/Linux yang populer. Demikian pula dengan .bz2 singkatan dari bzip2, yang merupakan format kompresi lebih baru yang memberikan kompresi lebih tinggi (ukuran file terkompresi lebih kecil) daripada gzip.

Setelah Anda mengunduh file sumber, buka jendela terminal (Terminal Sistem dari menu Ubuntu) dan ubah ke direktori tempat Anda menyimpan file. (Saya akan menggunakan ~/download dalam contoh ini. Di sini, '~' adalah pintasan ke direktori "home" Anda.) Gunakan perintah tar untuk mengekstrak file dari file arsip yang diunduh:

Jika file Anda adalah arsip gzip (mis. diakhiri dengan .tar.gz ), gunakan perintah:

            $ tar -zxvf filename.tar.gz

Jika file Anda adalah arsip bzip2 (mis. diakhiri dengan .tar.bz2 ), gunakan perintah:

            $ tar -jxvf filename.tar.gz

Kiat:Jika Anda tidak ingin mengingat semua sakelar baris perintah untuk mengekstrak arsip, saya sarankan untuk mendapatkan satu (atau keduanya) utilitas ini:dtrx (favorit saya!) atau deco (lebih populer). Dengan salah satu dari utilitas ini, Anda cukup memasukkan nama utilitas (dtrx atau deco) dan nama file, itu akan melakukan semuanya. Keduanya "tahu" cara menangani hampir semua format arsip yang mungkin Anda temui dan mereka memiliki penanganan kesalahan yang hebat.

Saat membuat dari sumber, ada dua jenis kesalahan umum yang mungkin Anda temui:

  1. Kesalahan konfigurasi terjadi saat Anda menjalankan skrip konfigurasi (biasanya bernama config atau configure) untuk membuat makefile yang khusus untuk penyiapan Anda.
  2. Kesalahan kompiler terjadi saat Anda menjalankan perintah make (setelah makefile dibuat) dan kompiler tidak dapat menemukan beberapa kode yang diperlukan.

Kita akan melihat masing-masing dan membahas cara mengatasinya.

Konfigurasi dan Kesalahan Konfigurasi

Setelah Anda mengekstrak file arsip kode sumber, di terminal, Anda harus mengubah ke direktori yang berisi file yang diekstraksi. Biasanya, nama direktori ini akan sama dengan nama file (tanpa .tar.gz atau .tar.bz2 perpanjangan). Namun, terkadang nama direktori hanyalah nama aplikasi, tanpa informasi versi apa pun.

Di direktori sumber, cari README file dan/atau INSTALL file (atau sesuatu dengan nama yang mirip). File-file ini biasanya berisi informasi berguna tentang cara membuat/mengkompilasi aplikasi dan menginstalnya, termasuk informasi tentang dependensi. "Dependencies" hanyalah nama keren untuk komponen atau pustaka lain yang diperlukan agar berhasil dikompilasi.

Setelah Anda membaca README dan/atau INSTALL file (dan, mudah-mudahan melihat dokumentasi online yang relevan untuk aplikasi), cari file yang dapat dieksekusi (memiliki izin "x" pada file) bernama config atau configure . Terkadang file mungkin memiliki ekstensi, seperti .sh (mis., config.sh ). Ini biasanya skrip shell yang menjalankan beberapa utilitas lain untuk mengonfirmasi bahwa Anda memiliki lingkungan "waras" untuk kompilasi. Dengan kata lain, ini akan memeriksa untuk memastikan bahwa Anda telah memasang semua yang Anda perlukan.

Tip:Jika ini adalah aplikasi berbasis Python, alih-alih file konfigurasi, Anda harus mencari file bernama setup.py Aplikasi .Python biasanya sangat mudah dipasang. Untuk menginstal aplikasi ini, sebagai root (misalnya, letakkan sudo di depan perintah berikut di bawah Ubuntu), jalankan perintah ini:

    $ python setup.py install

Hanya itu yang perlu Anda lakukan. Anda dapat melewati sisa tutorial ini dan langsung menggunakan dan menikmati aplikasi Anda.

Jalankan skrip konfigurasi di terminal. Biasanya, Anda dapat (dan harus!) menjalankan skrip konfigurasi dengan akun pengguna reguler Anda.

$ ./config

Skrip akan menampilkan beberapa pesan untuk memberi Anda gambaran tentang apa yang dilakukannya. Seringkali, skrip akan memberi Anda indikasi apakah berhasil atau gagal dan, jika gagal, beberapa informasi tentang penyebab kegagalan. Jika Anda tidak mendapatkan pesan kesalahan apa pun, biasanya Anda dapat berasumsi bahwa semuanya berjalan dengan baik.

Jika Anda tidak menemukan skrip yang terlihat seperti skrip konfigurasi, biasanya itu berarti aplikasi tersebut sangat sederhana dan tidak tergantung platform. Ini berarti Anda dapat langsung melompat ke langkah pembuatan/kompilasi di bawah ini, karena Makefile yang disediakan harus bekerja pada sistem apa pun.

Contoh

Dalam tutorial ini, saya akan menggunakan pembaca RSS berbasis teks bernama Newsbeuter sebagai contoh untuk jenis kesalahan yang mungkin Anda temui saat membuat aplikasi. Untuk Newsbeuter, nama script konfigurasinya adalah config.sh . Di sistem saya, ketika saya menjalankan config.sh , kesalahan berikut terjadi:

[email protected]:~/download/newsbeuter-1.3$ ./config.sh
Checking for package sqlite3... not found

You need package sqlite3 in order to compile this program.
Please make sure it is installed.

Setelah melakukan beberapa penelitian, saya menemukan bahwa, sebenarnya, sqlite3 aplikasi telah diinstal. Namun, karena saya mencoba membangun dari sumber, ini adalah tip tentang config.sh sebenarnya yang dicari adalah pustaka pengembangan (header) untuk sqlite3 . Di Ubuntu, sebagian besar paket memiliki paket mitra pengembangan terkait yang diakhiri dengan -dev . (Platform lain, seperti Fedora, sering menggunakan akhiran paket -devel untuk paket pengembangan.)

Untuk menemukan paket yang sesuai untuk sqlite3 paket pengembangan, kita dapat menggunakan apt-cache utilitas di Ubuntu (dan, demikian pula, yum utilitas di Fedora):

[email protected]:~/download/newsbeuter-1.3$ sudo apt-cache search sqlite

Perintah ini mengembalikan daftar hasil yang cukup besar, jadi kita harus melakukan sedikit pekerjaan detektif untuk menentukan paket mana yang sesuai. Dalam hal ini, paket yang sesuai adalah libsqlite3-dev . Perhatikan bahwa terkadang paket yang kita cari memiliki lib awalan, bukan hanya nama paket yang sama plus -dev . Ini karena terkadang kita hanya mencari shared library yang mungkin bisa digunakan oleh banyak aplikasi yang berbeda. Untuk memasang libsqlite3-dev , jalankan perintah apt-get install di terminal:

[email protected]:~/download/newsbeuter-1.3$ sudo apt-get install libsqlite3-dev

Sekarang, kita harus menjalankan config.sh lagi untuk memastikan bahwa kita telah menyelesaikan masalah ketergantungan ini dan bahwa kita tidak memiliki masalah ketergantungan lagi. (Meskipun saya tidak akan menunjukkannya di sini, dalam kasus Newsbeuter, saya juga harus menginstal libcurl4-openssl-dev juga.) Juga, jika Anda menginstal paket pengembangan (seperti libsqlite3-dev ) dan paket aplikasi terkait (mis., sqlite3 ) belum terinstal, sebagian besar sistem akan secara otomatis menginstal paket aplikasi terkait pada waktu yang sama.

Ketika konfigurasi berjalan dengan sukses, hasilnya akan membuat satu atau lebih file make. File-file ini biasanya bernama Makefile (ingat bahwa kasus nama file penting di Unix/Linux!). Jika paket build menyertakan subdirektori, seperti src , dll., masing-masing subdirektori ini akan berisi Makefile , juga.

Kesalahan Pembuatan dan Penyusunan

Sekarang, kami siap untuk benar-benar mengkompilasi aplikasi. Ini sering disebut bangunan dan namanya dipinjam dari proses dunia nyata dalam membangun sesuatu. Berbagai "bagian" dari aplikasi, yang biasanya berupa beberapa file kode sumber, digabungkan bersama untuk membentuk keseluruhan aplikasi. Utilitas make mengelola proses build dan memanggil aplikasi lain, seperti compiler dan linker, untuk benar-benar melakukan pekerjaannya. Dalam kebanyakan kasus, Anda cukup menjalankan make (dengan akun pengguna reguler Anda) dari direktori tempat Anda menjalankan konfigurasi. (Dalam beberapa kasus, seperti mengompilasi aplikasi yang ditulis dengan pustaka Qt, Anda harus menjalankan aplikasi "wrapper" lain seperti qmake. Sekali lagi, selalu periksa README dan/atau INSTALL dokumen untuk detail.)

Seperti skrip konfigurasi di atas, saat Anda menjalankan make (atau utilitas serupa) di terminal, ini akan menampilkan beberapa pesan tentang apa yang sedang dieksekusi dan peringatan serta kesalahan apa pun. Anda biasanya dapat mengabaikan peringatan, karena peringatan tersebut terutama untuk pengembang aplikasi dan memberi tahu mereka bahwa ada beberapa praktik standar yang dilanggar. Biasanya peringatan ini tidak mempengaruhi fungsi aplikasi. Di sisi lain, kesalahan kompiler harus ditangani. Dengan Newsbeuter, saat saya menjalankan make, semuanya berjalan baik untuk sementara, tetapi kemudian saya mendapatkan kesalahan:

[email protected]:~/download/newsbeuter-1.3$ make
...
c++ -ggdb -I/sw/include -I./include -I./stfl -I./filter -I. -I./xmlrss -Wall -Wextra -DLOCALEDIR=\"/usr/local/share/locale\" -o src/configparser.o -c src/configparser.cpp
c++ -ggdb -I/sw/include -I./include -I./stfl -I./filter -I. -I./xmlrss -Wall -Wextra -DLOCALEDIR=\"/usr/local/share/locale\" -o src/colormanager.o -c src/colormanager.cpp
In file included from ./include/pb_view.h:5,
from src/colormanager.cpp:4:
./include/stflpp.h:5:18: error: stfl.h: No such file or directory
In file included from ./include/pb_view.h:5,
from src/colormanager.cpp:4:
./include/stflpp.h:33: error: ISO C++ forbids declaration of \u2018stfl_form\u2019 with no type
./include/stflpp.h:33: error: expected \u2018;\u2019 before \u2018*\u2019 token
./include/stflpp.h:34: error: ISO C++ forbids declaration of \u2018stfl_ipool\u2019 with no type
./include/stflpp.h:34: error: expected \u2018;\u2019 before \u2018*\u2019 token
make: *** [src/colormanager.o] Error 1

Proses make akan berhenti segera setelah kesalahan pertama ditemukan. Menangani kesalahan kompiler terkadang bisa menjadi bisnis yang rumit. Anda harus melihat kesalahan untuk beberapa petunjuk tentang masalah tersebut. Biasanya, masalahnya adalah beberapa file header, yang biasanya memiliki ekstensi .h atau .hpp , hilang. Dalam kasus kesalahan di atas, jelas (atau seharusnya!) bahwa masalahnya adalah stfl.h file header tidak dapat ditemukan. Seperti yang ditunjukkan contoh ini, Anda ingin melihat baris pertama pesan kesalahan dan menelusurinya untuk menemukan penyebab mendasar dari masalah tersebut.

Setelah melihat dokumentasi Newsbeuter (yang seharusnya saya lakukan sebelum saya mulai, tetapi bagian tutorial ini tidak akan terlalu berarti!), Saya menemukan bahwa ini memerlukan perpustakaan pihak ke-3 yang disebut STFL. Jadi apa yang kita lakukan dalam kasus ini? Ya, pada dasarnya kami mengulangi proses yang sama persis untuk pustaka yang diperlukan:dapatkan pustaka dan jalankan proses konfigurasi-bangun-instal untuk itu dan, kemudian, lanjutkan pembuatan aplikasi yang diinginkan. Misalnya, dalam kasus STFL, saya harus memasang libncursesw5-dev paket untuk itu untuk membangun dengan benar. (Biasanya, tidak perlu mengulang langkah konfigurasi pada aplikasi asli kita setelah menginstal aplikasi lain yang diperlukan, tetapi tidak ada salahnya juga.)

Setelah berhasil menginstal toolkit STFL, proses make untuk Newsbeuter berjalan dengan sukses. Proses make biasanya mengambil di mana ia berhenti (pada titik kesalahan). Dengan demikian, setiap file yang telah berhasil dikompilasi tidak akan dikompilasi ulang. Jika ingin mengkompilasi ulang semuanya, Anda dapat menjalankan make clean all untuk menghapus semua objek yang dikompilasi, lalu menjalankan make lagi.

Memasang

Setelah proses build selesai dengan sukses, Anda siap untuk menginstal aplikasi. Dalam kebanyakan kasus, untuk menginstal aplikasi ke area umum sistem file (mis., /usr/bin atau /usr/share/bin , dll.), Anda harus menjalankan instalasi sebagai root. Menginstal benar-benar langkah paling sederhana dalam keseluruhan proses. Untuk menginstal, di terminal jalankan:

$ make install

Periksa output dari proses ini untuk setiap kesalahan. Jika semuanya berhasil, Anda seharusnya dapat menjalankan nama perintah di terminal dan itu akan diluncurkan. (Tambahkan &ke akhir baris perintah, jika itu adalah aplikasi GUI, atau Anda tidak akan dapat menggunakan sesi terminal hingga aplikasi selesai dijalankan.)

Saat Anda membuat aplikasi dari sumber, biasanya aplikasi tidak akan menambahkan ikon atau pintasan ke menu GUI di Ubuntu. Anda perlu menambahkan ini secara manual.

Dan itu pada dasarnya adalah proses, meskipun berpotensi berulang, untuk membangun dan menginstal aplikasi dari sumber di Ubuntu. Setelah Anda melakukan ini beberapa kali, itu akan menjadi kebiasaan Anda!

Solusi 4:

Nah, ./configure --help akan memberi Anda banyak informasi, karena GNU autotool menghasilkan file konfigurasi. Sebagian besar turun ke --dengan/--tanpa untuk mengaktifkan fitur (ini mungkin membutuhkan parameter tambahan, seperti "dibagikan" untuk mengatakan di mana menemukan perpustakaan).

Yang penting lainnya adalah --prefix (yang defaultnya ke /usr/local/ sebagian besar waktu) untuk mengatakan di mana harus menginstal (jika Anda membuat paket, Anda biasanya menginginkan ini sebagai --prefix=/usr atau mungkin --prefix =/opt/PaketAnda).

Di Linux, /lib, /usr/lib dan /usr/local/lib biasanya dicari di gcc saya, dan disertakan dalam konfigurasi default ldconfig. Kecuali Anda memiliki alasan yang bagus, di sinilah Anda menginginkan perpustakaan Anda. /etc/ld.so.conf mungkin mencantumkan entri tambahan.

konfigurasikan dan temukan mereka hanya dengan mencoba menjalankan "gcc -l" dan melihat apakah ada kesalahan. Anda dapat menambahkan "-L" ke parameter CFLAGS untuk menambahkan jalur ekstra ke penelusuran.

Anda dapat memasang beberapa versi, dan perangkat lunak yang ditautkan dengan versi lama akan tetap ditautkan dengannya (jalankan ldd untuk mengetahui pengikatan di Linux), tetapi kompilasi baru umumnya menargetkan versi terbaru pustaka dinamis di sistem Anda.

Sebagian besar perangkat lunak mengasumsikan lib dinamis, terutama jika menggunakan libtool, sehingga Anda mungkin menemukan aplikasi nontrivial tidak dibuat dengan benar secara statis.

ls -l adalah taruhan terbaik Anda untuk menemukan pustaka yang terpasang.

Dan di situlah saya kehabisan informasi; cara bermain dengan baik dengan paket:tidak tahu. Jika memungkinkan, saya mencoba dan membungkus semuanya menjadi satu paket untuk menghindari masalah.

Solusi 5:

Untuk menjawab sedikit pertanyaan Anda, saya menemukan cara yang baik beberapa hari yang lalu untuk melihat perpustakaan apa yang telah Anda instal dan versinya (Ini ada di Linux Debian jadi harus bekerja dengan versi lain juga).

dpkg --list

Anda harus mendapatkan daftar yang sangat panjang dengan beberapa keluaran seperti ini

ii  libssl0.9.8    0.9.8c-4etch5  SSL shared libraries
ii  libssp0        4.1.1-21       GCC stack smashing protection library
ii  libstdc++5     3.3.6-15       The GNU Standard C++ Library v3
ii  libstdc++5-3.3 3.3.6-15       The GNU Standard C++ Library v3 (development
ii  libstdc++6     4.1.1-21       The GNU Standard C++ Library v3

Linux
  1. Mengapa perpustakaan umum saya memilih Linux dan open source

  2. Panduan untuk memahami pustaka perangkat lunak Linux di C

  3. Pustaka C untuk membaca versi EXE dari Linux?

  1. Kisah Linux Saya:Dari penggemar 8-bit hingga sysadmin Unix

  2. Cara Mengkompilasi Brotli dari Sumber di CentOS 7

  3. Pengantar Pustaka Bersama Linux (Cara Membuat Pustaka Bersama)

  1. Cara Mengkompilasi dan Menginstal Perangkat Lunak dari Kode Sumber di Linux

  2. Bagaimana cara mengkompilasi pustaka standar glibc C saya sendiri dari sumber dan menggunakannya?

  3. Tidak dapat mengkompilasi contoh dari buffer protokol google