我正在尝试将一些代码从 Solaris 机器移植到 Linux(特别是 Redhat)机器上。代码编译没有问题,在 Solaris 机器上运行也没有问题。
但是,在 Linux 上重新编译时,我遇到了 tcl.h 的问题 - 编译器告诉我
error: tcl.h: No such file or directory
对于多个文件,#include "tcl.h"
。
据我所知,tcl8.4 和 tk8.4 均已安装:
但是,我在任何地方都找不到 tcl.h。有谁知道它会在哪里?或者它是 Solaris 需要但 Linux 不需要包含的文件之一?或者除了 tcl/tk 8.4 之外我还需要安装其他东西吗?
您需要安装development包才能获取头文件。根据您的 Linux 发行版,查找名为
tcl8.4-dev
和 tk8.4-dev
的软件包。
听起来您没有安装 tcl 的开发文件(库通常与标头分开打包)。尝试:
$ rpm -qa | grep tcl
如果不存在,请找到 -devel 软件包进行安装。如果是,则它可能位于编译器未包含的目录中。如果安装了,应该可以找到rpm的文件(我觉得选项是
-ql <packagename>
)
sudo dnf makecache
sudo dnf install tcl-devel.x86_64
rpm -qa |grep tcl
之前的所有答案都不适用于
docker
图像,例如对于ubuntu
,php
。解决办法如下:
from php:7.3.30-apache-bullseye
RUN apt-get update && apt-get install -qq tcl tcl-dev tk tk-dev
RUN apt-get install -qq expect expect-dev git
# TO INSTALL EXPECT YOU NEED TO REPLACE 100500 PACKAGES #
# SINCE UBUNTU WENT MAD LOL #
WORKDIR /usr/include
RUN git clone https://github.com/christophchamp/expect.git expect_builder && \
cp -r expect_builder/* . && \
cp -r tcl/* .
WORKDIR /usr/include/expect_builder
# replace with ./configure --build=x86_64-unknown-linux-gnu for x86 #
RUN ./configure --build=aarch64-unknown-linux-gnu && \
make && \
cp libexpect5.45.1.so /usr/lib/libexpect.so && \
cp expect /usr/lib/expect
RUN pecl install expect
RUN echo "extension=expect" >> "$PHP_INI_DIR/php.ini-production" && \
mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
WORKDIR /var/www/html
COPY src/ /var/www/html/
# export ports #
EXPOSE 80
# update flag #
RUN echo 'user_flag:FLAG{...}' >> /etc/passwd
# change user #
USER www-data
debian 和 ubuntu 不会将
tcl
安装到 usr/include
位置,而是安装在 usr/include/tcl
内部。要解决此问题,您可以将所有文件复制到usr/include
。但它只能解决问题的第一部分,因为 apt-get install expect
不安装任何头文件。为了解决这部分问题,我找到了以下 repo ,它基本上是旧 expect
源的分支。您可以克隆它、解压并配置/制作。之后,您必须将其放置到正确的位置。