Simon! Tôi hiểu cảm giác của bạn; Tôi cũng vật lộn với phần học Linux này. Dựa trên kinh nghiệm của bản thân, tôi đã viết một bài hướng dẫn về một số mục mà bạn đề cập (chủ yếu là tài liệu tham khảo cho bản thân mình!): Http://easyaspy.blogspot.com/2008/12/buildinginstalling-application-from.html . Tôi nghĩ bạn sẽ đánh giá cao lưu ý của tôi về cách xây dựng / cài đặt các ứng dụng Python đơn giản. :)
Hy vọng rằng điều này sẽ giúp! Và hạnh phúc biên dịch.
Tim Jones
Xây dựng / Cài đặt ứng dụng từ nguồn trong Ubuntu Linux
Mặc dù các kho lưu trữ Ubuntu có rất nhiều ứng dụng tuyệt vời, nhưng lúc này hay lúc khác, bạn nhất định bắt gặp công cụ "phải có" đó không có trong kho (hoặc không có gói Debian) hoặc bạn cần phiên bản mới hơn trong kho. Bạn làm nghề gì? Vâng, bạn phải xây dựng ứng dụng từ nguồn! Đừng lo lắng, nó thực sự không phức tạp như âm thanh. Dưới đây là một số lời khuyên, dựa trên kinh nghiệm của tôi về việc trở thành một người nghiệp dư hạng! (Trong khi tôi đang sử dụng Ubuntu cho ví dụ này, các khái niệm chung nên được áp dụng cho hầu hết mọi bản phân phối Unix / Linux, như Fedora, và thậm chí cả nền tảng Cygwin trên Windows.)
Quá trình cơ bản của việc xây dựng (biên dịch) hầu hết các ứng dụng từ nguồn tuân theo trình tự này: configure -> compile -> install. Các lệnh Unix / Linux điển hình để thực hiện những việc này là: config
-> make
-> make install
. Trong một số trường hợp, bạn thậm chí sẽ tìm thấy các trang web cho thấy rằng tất cả những trang này có thể được kết hợp thành một lệnh duy nhất:
$ config && make && make install
Tất nhiên, lệnh này giả định rằng không có vấn đề trong bất kỳ bước nào trong số này. Đây là nơi niềm vui đến!
Bắt đầu
Nếu bạn chưa biên dịch một ứng dụng từ nguồn trên hệ thống của mình trước đó, có lẽ bạn sẽ cần phải thiết lập nó với một số công cụ phát triển chung, chẳng hạn như bộ gcc
trình biên dịch, một số tệp tiêu đề phổ biến (hãy nghĩ rằng đây là mã đã được viết bởi người khác được sử dụng bởi chương trình bạn đang cài đặt) và công cụ make. May mắn thay, trong Ubuntu, có một siêu dữ liệu được gọi là build-essential
sẽ cài đặt cái này. Để cài đặt nó (hoặc chỉ cần đảm bảo rằng bạn đã có nó!), Hãy chạy lệnh này trong terminal:
$ sudo apt-get install build-essential
Bây giờ bạn đã có thiết lập cơ bản, tải xuống các tệp nguồn ứng dụng và lưu chúng vào một thư mục mà bạn có quyền đọc / ghi, chẳng hạn như thư mục "nhà" của bạn. Thông thường, chúng sẽ nằm trong một tệp lưu trữ có phần mở rộng tệp là .tar.gz
hoặc .tar.bz2
. Điều .tar
đơn giản có nghĩa là đó là một "kho lưu trữ băng", đó là một nhóm các tệp bảo tồn cấu trúc thư mục tương đối của chúng. Chữ .gz
viết tắt của gzip (GNU zip), là định dạng nén Unix / Linux phổ biến. Tương tự, .bz2
viết tắt của bzip2, là định dạng nén mới hơn cung cấp khả năng nén cao hơn (kích thước tệp nén nhỏ hơn) so với gzip.
Sau khi bạn đã tải xuống tệp nguồn, hãy mở một cửa sổ đầu cuối (System Terminal từ menu Ubuntu) và thay đổi thư mục nơi bạn đã lưu tệp của mình. (Tôi sẽ sử dụng ~/download
trong ví dụ này. Ở đây, '~' là lối tắt đến thư mục "nhà" của bạn.) Sử dụng lệnh tar để trích xuất các tệp từ tệp lưu trữ đã tải xuống:
Nếu tệp của bạn là kho lưu trữ gzip (ví dụ: kết thúc bằng .tar.gz
), hãy sử dụng lệnh:
$ tar -zxvf filename.tar.gz
Nếu tệp của bạn là tệp lưu trữ bzip2 (ví dụ: kết thúc bằng .tar.bz2
), hãy sử dụng lệnh:
$ tar -jxvf filename.tar.gz
Mẹo: Nếu bạn không muốn phải nhớ tất cả các công tắc dòng lệnh để trích xuất tài liệu lưu trữ, tôi khuyên bạn nên lấy một (hoặc cả hai) các tiện ích này: dtrx (yêu thích của tôi!) Hoặc trang trí (phổ biến hơn). Với một trong hai tiện ích này, bạn chỉ cần nhập tên của tiện ích (dtrx hoặc trang trí) và tên tệp, nó sẽ thực hiện tất cả các phần còn lại. Cả hai cách "biết" này để xử lý hầu hết mọi định dạng lưu trữ mà bạn có khả năng chạy qua và chúng có khả năng xử lý lỗi rất lớn.
Khi xây dựng từ nguồn, có hai loại lỗi phổ biến mà bạn có thể gặp phải:
- Lỗi cấu hình xảy ra khi bạn chạy tập lệnh cấu hình (thường được đặt tên là config hoặc configure) để tạo tệp tạo tệp dành riêng cho thiết lập của bạn.
- Lỗi trình biên dịch xảy ra khi bạn chạy lệnh make (sau khi tệp makefile được tạo) và trình biên dịch không thể tìm thấy một số mã mà nó cần.
Chúng ta sẽ xem xét từng vấn đề và thảo luận cách giải quyết chúng.
Lỗi cấu hình và cấu hình
Sau khi bạn giải nén tệp lưu trữ mã nguồn, trong thiết bị đầu cuối, bạn nên thay đổi thư mục chứa các tệp được giải nén. Thông thường, tên thư mục này sẽ giống như tên của tệp (không có .tar.gz
hoặc .tar.bz2
phần mở rộng). Tuy nhiên, đôi khi tên thư mục chỉ là tên của ứng dụng, không có bất kỳ thông tin phiên bản nào.
Trong thư mục nguồn, hãy tìm một README
tệp và / hoặc một INSTALL
tệp (hoặc một cái gì đó có tên tương tự). Các tệp này thường chứa thông tin hữu ích về cách xây dựng / biên dịch ứng dụng và cài đặt ứng dụng, bao gồm thông tin về các phụ thuộc. "Phụ thuộc" chỉ là một tên ưa thích cho các thành phần hoặc thư viện khác được yêu cầu để biên dịch thành công.
Sau khi bạn đã đọc README
và / hoặc INSTALL
tệp (và, hy vọng xem bất kỳ tài liệu trực tuyến có liên quan nào cho ứng dụng), hãy tìm tệp thực thi (có quyền "x" được đặt trên tệp) có tên config
hoặc configure
. Đôi khi tệp có thể có phần mở rộng, chẳng hạn như .sh
(ví dụ config.sh
:). Đây thường là tập lệnh shell chạy một số tiện ích khác để xác nhận rằng bạn có môi trường "lành mạnh" để biên dịch. Nói cách khác, nó sẽ kiểm tra để đảm bảo rằng bạn đã cài đặt mọi thứ mà bạn cần.
Mẹo: Nếu đây là một ứng dụng dựa trên Python, thay vì tệp cấu hình, bạn nên tìm một tệp có tên setup.py
. Các ứng dụng Python thường rất đơn giản để cài đặt. Để cài đặt ứng dụng này, với quyền root (ví dụ: đặt sudo trước lệnh sau trong Ubuntu), hãy chạy lệnh này:
$ python setup.py install
Đó nên là tất cả những gì bạn cần làm. Bạn có thể bỏ qua phần còn lại của hướng dẫn này và trực tiếp sử dụng và thưởng thức ứng dụng của bạn.
Chạy tập lệnh cấu hình trong thiết bị đầu cuối. Thông thường, bạn có thể (và nên!) Chạy tập lệnh cấu hình bằng tài khoản người dùng thông thường của bạn.
$ ./config
Kịch bản sẽ hiển thị một số thông báo để cho bạn biết về những gì nó đang làm. Thông thường, tập lệnh sẽ cung cấp cho bạn một dấu hiệu cho biết nó đã thành công hay thất bại và nếu thất bại, một số thông tin về nguyên nhân của sự thất bại. Nếu bạn không nhận được bất kỳ thông báo lỗi nào, thì bạn thường có thể cho rằng mọi thứ đều ổn.
Nếu bạn không tìm thấy bất kỳ tập lệnh nào trông giống như tập lệnh cấu hình, thì điều đó thường có nghĩa là ứng dụng này rất đơn giản và nó độc lập với nền tảng. Điều này có nghĩa là bạn có thể chỉ cần bỏ qua bước xây dựng / biên dịch bên dưới, vì được cung cấp Makefile
sẽ hoạt động trên bất kỳ hệ thống nào.
Một ví dụ
Trong hướng dẫn này, tôi sẽ sử dụng trình đọc RSS dựa trên văn bản có tên Newsbeuter làm ví dụ cho các loại lỗi mà bạn có thể gặp phải khi xây dựng ứng dụng của mình. Đối với Newsbeuter, tên của tập lệnh cấu hình là config.sh
. Trên hệ thống của tôi, khi tôi chạy config.sh
, xảy ra các lỗi sau:
tester@sitlabcpu22:~/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.
Khi thực hiện một số nghiên cứu, tôi thấy rằng, trên thực tế, sqlite3
ứng dụng đã được cài đặt. Tuy nhiên, vì tôi đang cố gắng xây dựng từ nguồn, đây là một mẹo mà những gì config.sh
thực sự tìm kiếm là các thư viện phát triển (tiêu đề) sqlite3
. Trong Ubuntu, hầu hết các gói đều có gói đối tác phát triển liên quan kết thúc bằng -dev
. (Các nền tảng khác, chẳng hạn như Fedora, thường sử dụng hậu tố gói -devel
cho các gói phát triển.)
Để tìm gói thích hợp cho gói sqlite3
phát triển, chúng ta có thể sử dụng apt-cache
tiện ích trong Ubuntu (và tương tự, yum
tiện ích trong Fedora):
tester@sitlabcpu22:~/download/newsbeuter-1.3$ sudo apt-cache search sqlite
Lệnh này trả về một danh sách khá lớn các kết quả, vì vậy chúng tôi phải thực hiện một chút công việc thám tử để xác định gói nào là phù hợp. Trong trường hợp này, gói thích hợp hóa ra là libsqlite3-dev
. Lưu ý rằng đôi khi gói chúng tôi đang tìm kiếm sẽ có lib
tiền tố, thay vì chỉ có cùng tên gói -dev
. Điều này là do đôi khi chúng ta chỉ tìm kiếm một thư viện chia sẻ có thể được sử dụng bởi nhiều ứng dụng khác nhau. Để cài đặt libsqlite3-dev
, hãy chạy lệnh cài đặt apt-get điển hình trong thiết bị đầu cuối:
tester@sitlabcpu22:~/download/newsbeuter-1.3$ sudo apt-get install libsqlite3-dev
Bây giờ, chúng tôi phải chạy config.sh
lại để đảm bảo rằng chúng tôi đã giải quyết vấn đề phụ thuộc này và chúng tôi không có bất kỳ vấn đề phụ thuộc nào nữa. (Mặc dù tôi sẽ không hiển thị ở đây, nhưng trong trường hợp của Newsbeuter, tôi cũng phải cài đặt libcurl4-openssl-dev
gói.) Ngoài ra, nếu bạn cài đặt gói phát triển (như libsqlite3-dev
) và gói ứng dụng liên quan (ví dụ sqlite3
:) thì không đã được cài đặt, hầu hết các hệ thống sẽ tự động cài đặt gói ứng dụng liên quan cùng một lúc.
Khi cấu hình chạy thành công, kết quả sẽ là nó sẽ tạo một hoặc nhiều tệp tạo. Các tệp này thường được đặt tên Makefile
(hãy nhớ rằng trường hợp tên tệp có vấn đề trong Unix / Linux!). Nếu gói xây dựng bao gồm các thư mục con, chẳng hạn như src
, v.v., thì mỗi thư mục con này cũng sẽ chứa một Makefile
.
Lỗi xây dựng và biên dịch
Bây giờ, chúng tôi đã sẵn sàng để thực sự biên dịch ứng dụng. Điều này thường được gọi là xây dựng và tên được mượn từ quá trình xây dựng một cái gì đó trong thế giới thực. Các "mảnh" khác nhau của ứng dụng, thường là nhiều tệp mã nguồn, được kết hợp với nhau để tạo thành ứng dụng tổng thể. Tiện ích make quản lý quá trình xây dựng và gọi các ứng dụng khác, chẳng hạn như trình biên dịch và trình liên kết, để thực sự làm việc. Trong hầu hết các trường hợp, bạn chỉ cần chạy make (với tài khoản người dùng thông thường) từ thư mục nơi bạn chạy cấu hình. (Trong một số trường hợp, chẳng hạn như biên dịch các ứng dụng được viết bằng thư viện Qt, bạn sẽ cần chạy một ứng dụng "trình bao bọc" khác như qmake. Một lần nữa, luôn luôn kiểm tra README
và / hoặc INSTALL
tài liệu để biết chi tiết.)
Như với tập lệnh cấu hình ở trên, khi bạn chạy make (hoặc tiện ích tương tự) trong thiết bị đầu cuối, nó sẽ hiển thị một số thông báo về những gì đang thực thi và bất kỳ cảnh báo và lỗi nào. Bạn thường có thể bỏ qua các cảnh báo, vì chúng chủ yếu dành cho các nhà phát triển ứng dụng và đang nói với họ rằng có một số thực tiễn tiêu chuẩn đang bị vi phạm. Thông thường, những cảnh báo này không ảnh hưởng đến chức năng ứng dụng. Mặt khác, các lỗi biên dịch phải được xử lý. Với Newsbeuter, khi tôi thực hiện, mọi thứ đã ổn trong một thời gian, nhưng sau đó tôi đã gặp một lỗi:
tester@sitlabcpu22:~/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
Quá trình thực hiện sẽ dừng lại ngay khi gặp lỗi đầu tiên. Xử lý lỗi trình biên dịch đôi khi có thể là khó khăn kinh doanh. Bạn phải xem xét các lỗi cho một số manh mối về vấn đề. Thông thường, vấn đề là một số tệp tiêu đề, thường có phần mở rộng .h
hoặc .hpp
, bị thiếu. Trong trường hợp lỗi ở trên, rõ ràng (hoặc nên là!) Rõ ràng rằng vấn đề là stfl.h
tệp tiêu đề không thể được tìm thấy. Như ví dụ này cho thấy, bạn muốn xem các dòng đầu tiên của thông báo lỗi và tìm cách tìm ra nguyên nhân cơ bản của vấn đề.
Sau khi xem tài liệu Newsbeuter (mà tôi nên làm trước khi bắt đầu, nhưng sau đó phần này của hướng dẫn sẽ không có ý nghĩa lắm!), Tôi thấy rằng nó yêu cầu một thư viện của bên thứ 3 có tên là STFL. Vậy chúng ta phải làm gì trong trường hợp này? Vâng, về cơ bản, chúng tôi lặp lại quy trình chính xác này cho thư viện cần thiết đó: lấy thư viện và thực hiện quy trình configure-build-install cho nó và sau đó, tiếp tục xây dựng ứng dụng mong muốn. Ví dụ, trong trường hợp STFL, tôi đã phải cài đặt libncursesw5-dev
gói cho nó để xây dựng đúng. (Thông thường, không cần thiết phải làm lại bước cấu hình trên ứng dụng gốc của chúng tôi sau khi cài đặt một ứng dụng bắt buộc khác, nhưng nó cũng không bao giờ bị tổn thương.)
Sau khi cài đặt thành công bộ công cụ STFL, quá trình tạo cho Newsbeuter đã chạy thành công. Quá trình thực hiện thường diễn ra ở nơi nó rời đi (tại điểm xảy ra lỗi). Do đó, bất kỳ tệp nào đã được biên dịch thành công sẽ không được biên dịch lại. Nếu bạn muốn biên dịch lại mọi thứ, bạn có thể chạy make make all để xóa mọi đối tượng đã biên dịch và sau đó chạy make make.
Cài đặt
Sau khi quá trình xây dựng hoàn tất thành công, bạn đã sẵn sàng để cài đặt ứng dụng. Trong hầu hết các trường hợp, để cài đặt ứng dụng vào các khu vực chung của hệ thống tệp (ví dụ: /usr/bin
hoặc /usr/share/bin
, v.v.), bạn sẽ cần chạy cài đặt dưới dạng root. Cài đặt thực sự là bước đơn giản nhất trong toàn bộ quá trình. Để cài đặt, trong thiết bị đầu cuối chạy:
$ make install
Kiểm tra đầu ra của quá trình này cho bất kỳ lỗi. Nếu mọi thứ đã thành công, bạn sẽ có thể chạy tên lệnh trong thiết bị đầu cuối và nó sẽ khởi chạy. (Nối và vào cuối dòng lệnh, nếu đó là ứng dụng GUI hoặc bạn sẽ không thể sử dụng phiên cuối cho đến khi ứng dụng kết thúc chạy.)
Khi bạn xây dựng một ứng dụng từ nguồn, nó thường sẽ không thêm biểu tượng hoặc lối tắt vào các menu GUI trong Ubuntu. Bạn sẽ cần phải thêm nó bằng tay.
Và về cơ bản, đó là quá trình, mặc dù có khả năng lặp lại, để xây dựng và cài đặt một ứng dụng từ nguồn trong Ubuntu. Sau khi bạn thực hiện điều này chỉ một vài lần, nó sẽ trở thành bản chất thứ hai đối với bạn!